Anim too fast...

BlitzPlus Forums/BlitzPlus Programming/Anim too fast...

Valgar(Posted 2003) [#1]
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


QuietBloke(Posted 2003) [#2]
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


DarkNature(Posted 2003) [#3]
-- edit --

beaten to the post by john with a more elegant fix


Valgar(Posted 2003) [#4]
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


QuietBloke(Posted 2003) [#5]
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.


Valgar(Posted 2003) [#6]
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




Ross C(Posted 2003) [#7]
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()



Valgar(Posted 2003) [#8]
hehehe very thanks!
I'm about to ask why some people have black box around the code :P


QuietBloke(Posted 2003) [#9]
glad to hear you got it working :)


Valgar(Posted 2003) [#10]
Thanks to you all :)