How to make 1 bullet go through 2 animation frames
BlitzPlus Forums/BlitzPlus Beginners Area/How to make 1 bullet go through 2 animation frames
| ||
In my game, I'm trying to make it so that when ONE bullet hits an enemy plane, I want the enemy plane to go through 2 frames before it explodes. That is, I'm trying to give the appearance that when a bullet hits a plane, the plane's catches fire (the first frame) and then later explodes (the second frame) and disappears (is deleted) afterwards. Below is my game program and the part I'm trying to fix is in the "Collision()" function section. Below, I wrote notes and drew a line there so that it can be easy to find. Thanks. Graphics 1600, 900 SetBuffer BackBuffer () AppTitle "Crazy Airline" Global AIRPLANE = LoadAnimImage ("Airplane Animation.PNG",260,195,0,5) Global ENEMYAIRPLANE = LoadAnimImage ("Small Airplane Exploding.PNG", 100,75,0,5) Global BULLETS = LoadImage ("Bullet.png") Global ENEMYPLANE Type AIRPLANE Field x,y Field image Field frame End Type Type BULLETS Field x,y Field image End Type Type ENEMYPLANE Field x,y Field image Field frame End Type Global ap.AIRPLANE = New AIRPLANE ap\x = 150 ap\y = 407 ap\image = AIRPLANE ap\frame = 1 While Not KeyDown (1) Cls DrawImage (ap\image, ap\x,ap\y,ap\frame) Controls() EnemyCharacteristics() Collisions() BulletInstructions() Flip Wend Function EnemyCharacteristics() en.ENEMYPLANE = New ENEMYPLANE en\image = ENEMYAIRPLANE en\frame = 1 en\x = 1000 en\y = 300 For en.ENEMYPLANE = Each ENEMYPLANE DrawImage (en\image,en\x,en\y,en\frame) en\x = en\x - 3 Exit Next End Function Function Controls() If KeyDown (205) Then ap\x = ap\x + 3 EndIf If KeyDown (203) Then ap\x = ap\x - 3 EndIf If KeyDown (208) Then ap\y = ap\y + 3 EndIf If KeyDown (200) Then ap\y = ap\y - 3 EndIf If KeyHit(57) Then Shoot() EndIf End Function Function Shoot() blt.BULLETS = New BULLETS blt\x = ap\x blt\y = ap\y-200 blt\image = BULLETS End Function Function BulletInstructions() For blt.BULLETS = Each BULLETS DrawImage (blt\image,blt\x,blt\y) blt\x = blt\x + 20 Next End Function Function Collisions(); --------- I need help here -------------------------------------------------------------------------------------------------------------- ;here's the part that I need help with. I want ONE bullet to cause 2 animation frames to occur. Frame 1 would be the normal plane (before the bullet), Frame 2 would be the plane catching fire after the bullet, and Frame 3 would be the explosion, Then afterwards, the plane would disappear (be deleted). Thanks. For blt.BULLETS = Each BULLETS For en.ENEMYPLANE = Each ENEMYPLANE If ImagesCollide (en\image,en\x,en\y,0,blt\image,blt\x,blt\y,0) Then en\frame = en\frame + 1 If en\frame > 3 Then Delete en Delete blt EndIf Exit EndIf Next Next ;-------------- Above and between these lines is all I need help with for now. Thanks----------------------------------------------------------------- For en.ENEMYPLANE = Each ENEMYPLANE If en\x <= 150 Then Delete en EndIf Next For blt.BULLETS = Each BULLETS If blt\x >= 1200 Then Delete blt EndIf Next End Function Last edited 2011 |
| ||
your problem shoud be solved by using timers. Add two new Field to the ENEMY_PLANE: Action% and Time%. Devide the function EnemyCharacteristics() in two functions EnemyCreate() and EnemyPaint(). In normal situation the em\Action is 0 which causes to paint the regular em\frame in EnemyPaint(). When a Collision happens, it would change the em\Action=1 (which means "dying") and set em\Time=Millisecs()+500. This means wait for further 500msec (=0.5sec), until do anything. In the EnemyPaint() you can now react on the em\Action when the em\Time overruns the Millisecs(). You could step forward em\frame=em\frame+1 and/or set em\Time again for a next waitung period and/or set em\Action to a new value: ... Type ENEMYPLANE Field x,y Field image Field frame , Time% , Action% End Type .... Function EnemyCreate() en.ENEMYPLANE = New ENEMYPLANE en\image = ENEMYAIRPLANE en\frame = 1 en\Action=0 en\x = 1000 en\y = 300 End Function Function EnenyPaint For en.ENEMYPLANE = Each ENEMYPLANE ;first draw it like before DrawImage (en\image,en\x,en\y,en\frame) en\x = en\x - 3 ;then check, whether there is an action to do: If en\Action=1 ;then check, whether the time is right for doing: If en\Time<MilliSecs() ;do what you want: en\frame = en\Frame+1 en\Time=Milisecs()+500 ;if reached frame 4 (which does not exist) kill me If en\frame=4 Delete en EndIf EndIf EndIf Next End Function Function Collisions() For blt.BULLETS = Each BULLETS For en.ENEMYPLANE = Each ENEMYPLANE If ImagesCollide (en\image,en\x,en\y,0,blt\image,blt\x,blt\y,0) Then en\Action=1 en\Time=MilliSecs() + 500 Delete blt Exit EndIf Next Next End Function ... Last edited 2011 |
| ||
Wow, Midimaster, thanks a lot. It worked. Thanks for helping me. I'll come back if I have more questions. |