Wave's~ BlitzMax Tutorial for NG | ~ November, 2015 ~ Version 11 |
Beginners guide to BlitzMax | |
Sounds | |
Sounds is loaded the same way as images, YourSound = LoadSound("boom.wav"). Then you can play the sound with PlaySound(YourSound). You can also use different channels for your sounds. You can load .ogg and wav files atm. I hope sounds are pretty self-explanatory after you have dealt with images. Read about it in the BMax reference and make your own example to try them. | |
Short Lesson On Collision Detection | |
Collision: To detect when something overlaps or is about to overlap something else. Let's say you want to know when your bullet hits the enemy. | |
One way to do it is to use this simple function which I snapped from the forums: | |
Function RectsOverlap(x0, y0, w0, h0, x2, y2, w2, h2) If x0 > (x2 + w2) Or (x0 + w0) < x2 Return False If y0 > (y2 + h2) Or (y0 + h0) < y2 Return False Return True End Function | |
This checks a rectangle at coordinate x0,y0 with a rectangle at x2,y2. w and h is the width and height of the rectangles, returns true if they overlap else false. This works perfect for enemy vs enemy or mouse-over-button collisions. Let's say you want to make sure that people don't walk thru walls, how would you do that? | |
Consider the following example: | |
Graphics 800,600,0 Local LastX Global Xvel# = 0.5, X# = 50 Repeat Cls LastX = X 'Save X X=X+Xvel 'Update X 'Draw the wall SetColor 255,255,255 'White DrawRect( 500,0,500,800 ) 'Draw moving object SetColor 255,0,0 'Red DrawRect( X, 50, 300, 55 ) If X+300 > 500 Then X=LastX 'We collided so reset to last saved X End If Flip Until KeyDown(Key_Escape) | |
The above shows how a simple wall check would work. The RectsOverlap Function above checks all sides of the square. There is another quite smart way to check collision and that is by distance. | |
In the end checking the distance is the same as checking against circular targets. | |
Strict Function Distance#( X1, Y1, X2, Y2 ) Local DX# = X2 - X1 Local DY# = Y2 - Y1 Return Sqr( Dx*DX + Dy*Dy ) EndFunction Graphics 800,600,0 Local LastX, LastY, MR = 20 ' MR Short for MouseRadius Local TargetX = 400 , TargetY = 400 Local TR = 300 ' TR Short for TargetRadius Repeat Cls 'Draw Mouse SetColor 0,155,0 ' Green DrawOval MouseX()-MR, MouseY()-MR, MR*2, MR*2 'Draw Target SetColor 0,0,255 ' Blue DrawOval TargetX-TR, TargetY-TR, TR*2, TR*2 If Distance( MouseX(), MouseY(), TargetX, TargetY ) < TR+MR MoveMouse( LastX, LastY ) ' Move it back SetColor 255,0,0 DrawText "CIRCULAR COLLISION DETECTED!",20,20 End If LastX = MouseX() ; LastY = MouseY() Flip Until KeyDown(Key_Escape) | |
The distance function is very handy. It gets a little more advanced if you want to stop, bounce or slide at surfaces. You can loop all your objects in a list and check each one against each other. Collision detection is very dependant on which type of game you are making. Blitz also has CollideImage functions, which can check your images for pixel perfect collisions. They are advanced and slow so I don't recommend any beginners to use them before they have proper documentation with good examples. | |
To Index | Next Page | page 21 |