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. |