Anim too fast...
BlitzPlus Forums/BlitzPlus Programming/Anim too fast...
| ||
| I have made an anim of when i destroy an alien he explode,but...the explode anim is a bit too fast to see o_O' Here's the code: Graphics 640,480,32,1 SetBuffer BackBuffer() Global posizionex Global posizioney Global posalienx Global posalieny Global aereo=LoadImage("d:\jet1.tga") ;a simple sprite Global terreno=LoadImage("d:\terreno.bmp") ;a simple texture of 256*256 Global missil=LoadImage("c:\missile2.bmp") ;a simple sprite Global alien=LoadImage("d:\velivolo1.tga") ;a simple sprite Global explosion=LoadAnimImage("d:\explode.bmp",64,64,0,9);an animstrip of 10 frames MidHandle explosion MidHandle aereo MidHandle missil MidHandle alien HidePointer Const limite_sx=100 Const limite_dx=540 Global b.alieno Global c.esplosione Type missile ;an object called missile Field posx Field posy Field avanzamento Field contatore Field image End Type Type alieno Field movx,movy,movimento,energia,image End Type Type esplosione Field posizionex,posizioney,frame End Type ;MAIN Repeat Cls DrawImage aereo,MouseX(),MouseY() If MouseHit(2)=1 create_alien() EndIf move_alien() If MouseHit(1)=1 ;if i hit the mouse button i create a missile create_missile() EndIf play_missile() ;this start the missil anim Flip Until KeyDown(1)=1 End ;END MAIN Function create_missile() a.missile=New missile a\image=missil a\posx=MouseX() ;the x position of missile creation is the mouse coords(the same coords of my jet of course) a\posy=a\posy+MouseY()-45 ;the missile creation start a bit up to the jet(for simulating the launch-bay hehe) a\avanzamento=4 ;the speed of the missile a\contatore=0 ;the starting value of the animation End Function Function play_missile() For a.missile=Each missile DrawImage a\image,a\posx,a\posy a\posy=a\posy-a\avanzamento ;this move the missile up a\contatore=a\contatore+a\avanzamento ;this start the counter of the missile course ;If a\contatore=> 200 Then Delete a ;if the course reach 200 the missile explode(hehe) For b.alieno=Each alieno If ImagesCollide(a\image,a\posx,a\posy,0,b\image,b\movx,b\movy,0) ;if the alien collide with the missile the energy go down of one unit b\energia=b\energia-1 If b\energia=<0 Then ;Delete b crea_esplosione() esplosione() Delete b EndIf Delete a;if the missile collide with the alien the missile stop it's existance :P Exit ;exit loop if missile is dead. will cause error as they's no missile to check against the aliens EndIf Next Next End Function Function create_alien() b.alieno=New alieno b\image=alien b\movx=100 b\movy=60 b\movimento=1 b\energia=5 ;the "teoric" energy of the alien,from when reach 0 the alien explode End Function Function move_alien() For b.alieno =Each alieno posalienx=b\movx posalieny=b\movy DrawImage b\image,b\movx,b\movy b\movx=b\movx + b\movimento If b\movx => limite_dx b\movx=b\movx-b\movimento b\movimento=-1 EndIf If b\movx =< limite_sx b\movx=b\movx+b\movimento b\movimento=+1 EndIf Text b\movx,b\movy-20,b\energia Next End Function Function crea_esplosione() c.esplosione=New esplosione c\posizionex=b\movx c\posizioney=b\movy c\frame=0 End Function Function esplosione() For c.esplosione=Each esplosione DrawImage explosion,b\movx,b\movy,c\frame c\frame=c\frame+1 If c\frame=9 Then Delete c Next End Function How i can repair this problem? And...there's a better method of doing an animation?? Thanks |
| ||
| One way to fix it would be to modify you explosion type to have an additional field Type esplosione Field posizionex,posizioney,frame Field frameCount End Type Then in your crea_Explosion() set the frameCount to 0. In the esplosio() function you increment the frameCount field and when it reaches a specified value reset it to zero and increment your frame. For example to animate the explosion to make it 10 times slower Function esplosione() For c.esplosione=Each esplosione DrawImage explosion,b\movx,b\movy,c\frame c\frameCount = c\frameCount + 1 if c\frameCount > 9 then c\frameCount = 0 c\frame=c\frame+1 If c\frame=9 Then Delete c end if Next End Function |
| ||
| -- edit -- beaten to the post by john with a more elegant fix |
| ||
| Strange i have modified the code but the anim is always too fast... Here's the two functions: Function crea_esplosione() c.esplosione=New esplosione c\posizionex=b\movx c\posizioney=b\movy c\frame=0 c\frameCount=0 End Function Function esplosione() For c.esplosione=Each esplosione DrawImage explosion,b\movx,b\movy,c\frame c\frameCount = c\frameCount + 1 If c\frameCount > 9 Then c\frameCount = 0 c\frame=c\frame+1 If c\frame=9 Then Delete c End If Next End Function |
| ||
| Ooo..OK.. Im not at home so I cant test the code but it seems you have a logic problem. The function esplosione() only gets called once in the play_missile() function after you create the explosion. I think maybe you should remove the call to esplosione() from the play_missile() function and insert it into your main loop after the call to play_missile(). I might be of more help once I get home tonight. |
| ||
| ARGH ok i have made it! The logical problems that a person can encounter when coding (a simple routines also...)anything are very tricky!!! I called the function crea_esplosione() into the function play_missile() for ONLY the creation of the object "esplosione"....so when the alien explode i create an instance of the explosion. But the animation of the explosion may be called into the MAIN program or it doesn't work!And i have resolved also the speed problem with another method :P Here's the whole code:
Graphics 640,480,32,1
SetBuffer BackBuffer()
Global aereo=LoadImage("d:\jet1.tga") ;a simple sprite
Global terreno=LoadImage("d:\terreno.bmp") ;a simple texture of 256*256
Global missil=LoadImage("c:\missile2.bmp") ;a simple sprite
Global alien=LoadImage("d:\velivolo1.tga") ;a simple sprite
Global explosion=LoadAnimImage("d:\explode.bmp",64,64,1,10);an animstrip of 10 frames
Global animation
Global posizionex
Global posizioney
Global b.alieno
Const limite_sx=100
Const limite_dx=540
MidHandle explosion
MidHandle aereo
MidHandle missil
MidHandle alien
HidePointer
Type missile ;an object called missile
Field posx Field posy Field avanzamento Field contatore
Field image
End Type
Type alieno
Field movx,movy,movimento,energia,image
End Type
Type esplosione
Field posizionex,posizioney,frame,timer
End Type
;MAIN
Repeat
Cls
DrawImage aereo,MouseX(),MouseY()
If MouseHit(2)=1
create_alien() ;if i hit the right-mouse button i create an alien
EndIf
move_alien() ;start the alien movement
If MouseHit(1)=1 ;if i hit the mouse button i create a missile
create_missile()
EndIf
play_missile() ;this start the missil anim
esplosione() ;this start the explosion anim
Flip
Until KeyDown(1)=1
End
;END MAIN
Function create_missile()
a.missile=New missile
a\image=missil
a\posx=MouseX() ;the x position of missile creation is the mouse coords(the same coords of my jet of course)
a\posy=a\posy+MouseY()-45 ;the missile creation start a bit up to the jet(for simulating the launch-bay hehe)
a\avanzamento=4 ;the speed of the missile
a\contatore=0 ;the starting value of the animation
End Function
Function play_missile()
For a.missile=Each missile
DrawImage a\image,a\posx,a\posy
a\posy=a\posy-a\avanzamento ;this move the missile up
a\contatore=a\contatore+a\avanzamento ;this start the counter of the missile course
For b.alieno=Each alieno
If ImagesCollide(a\image,a\posx,a\posy,0,b\image,b\movx,b\movy,0) ;if the alien collide with the missile the energy go down of one unit
b\energia=b\energia-1
If b\energia=<0 Then ;if the alien energy go to zero i create an explosion but DON'T animate it now!
crea_esplosione() ;creation of the object explosion
Delete b
EndIf
Delete a ;if the missile collide with the alien the missile stop it's existance :P
Exit ;exit loop if missile is dead. will cause error as they's no missile to check against the aliens
EndIf
Next
Next
End Function
Function create_alien()
b.alieno=New alieno
b\image=alien
b\movx=100
b\movy=60
b\movimento=1
b\energia=5 ;the "teoric" energy of the alien,from when reach 0 the alien explode
End Function
Function move_alien()
For b.alieno =Each alieno
posalienx=b\movx
posalieny=b\movy
DrawImage b\image,b\movx,b\movy
b\movx=b\movx + b\movimento
If b\movx => limite_dx
b\movx=b\movx-b\movimento
b\movimento=-1
EndIf
If b\movx =< limite_sx
b\movx=b\movx+b\movimento
b\movimento=+1
EndIf
Text b\movx,b\movy-20,b\energia
Next
End Function
Function crea_esplosione()
c.esplosione=New esplosione
c\posizionex=b\movx ;the explosion position is the same as the alien position(considering mid-handle)
c\posizioney=b\movy ;see up :P
End Function
Function esplosione()
For c.esplosione=Each esplosione
If MilliSecs() > c\timer + 50 Then ;i use a "slowdown"of 50 millisecs
c\timer=MilliSecs()
c\frame=( c\frame + 1 ) Mod 10 ;i loop trough the 10 frames of the explosion
EndIf
DrawImage explosion,c\posizionex,c\posizioney,c\frame
If c\frame=>9 Then Delete c ;when the frame 10 is displayed the explosion delete itself
Next
End Function
|
| ||
| hey, see if you use the forum tags you can get that in a nice black box, alot better for cutting and pasting. the code is (code) graphics3d 800,600 setbuffer backbuffer() (/code) replace ( with [ and ) with ] which becomes graphics3d 800,600 setbuffer backbuffer() |
| ||
| hehehe very thanks! I'm about to ask why some people have black box around the code :P |
| ||
| glad to hear you got it working :) |
| ||
| Thanks to you all :) |