wolron - please help
Blitz3D Forums/Blitz3D Beginners Area/wolron - please help| 
 | ||
| Hi I have used the code you posted earlier regarding fps speed. Can you please tell me why the framerate moves so fast. I have set the speed to 25 and 100 but I cant figure out whats wrong thanks www.geocities.com/gjpollitt/game.zip | 
| 
 | ||
| I just looked through the code, I didn't run the game. Here is your code: ;==========================================================================================
;#Region setup
;create globals for video display
Global gfx_x=640
Global gfx_y=480
Global gfx_colour_depth=16
;Global man_walk
;==========================================================================================
;create window
Graphics  gfx_x,gfx_y,gfx_colour_depth,0 ;screen =640,480,16 bit colour
AppTitle="H.E.R.O."
SetBuffer BackBuffer()
;SeedRnd MilliSecs();get better random result
;HidePointer ;hide the mouse arrow
;#End Region
;==========================================================================================
;variables etc
;#Region variables etc
	
Global manfly ;rocket on? 1 yes 0 no
Global manleft ; 1 left 0 right
Global manflyframechange=0 ;change frame count depending on 1 flying or 0 walking 
Global manfirerange ; range of laser fire
Global manfire ;is man firing? 1 yes 0 no
Global gfx_manwalk=LoadAnimImage("gfx\gfx_manwalk.bmp" ,80,80,0,13)
Global gfx_manfly=LoadAnimImage("gfx\gfx_manfly.bmp",80,80,0,5)
Global gfx_manfire=LoadImage("gfx\gfx_laser.bmp")
ScaleImage (gfx_manfire,.4,.4)
Global gfx_bat=LoadAnimImage("gfx\gfx_bat.bmp",84,65,0,4)
Global gfx_background=LoadImage("gfx\gfx_backdrop.bmp")
MaskImage gfx_manwalk,255,0,255
MaskImage gfx_manfly,255,0,255
MaskImage gfx_bat,255,0,255
Global SpeedFactor
Global Debug = True
Global no0# = 0.00000000001	;avoids division by zero
;for example; any time you perform a division, add no0# to the divisor
;quotient# = dividend# / (divisor# + no0#)
;#End Region
;==========================================================================================
;create types
Type manwalk
	Field x,y,frame,gfx
End Type
Type bat
	Field x,y,frame,gfx,up,lft,alive,id,xmax,ymax,xmin,ymin
End Type
Type FrameRate
	Field TargetFPS#
	Field SpeedFactor#
	Field TimeElapsed#
	Field FPS#
	Field FPS2#
	Field FPS3#
	Field FPS4#
	Field FPS5#
	Field CurrentTicks
	Field FrameDelay
End Type
;==========================================================================================
;create objects from types
;#Region type objects
Global man.manwalk=New manwalk
man\frame =6
man\x=160
man\y=240
man\gfx=gfx_manwalk
Global bat1.bat=New bat
bat1\frame=0
bat1\x=320
bat1\y=160
bat1\gfx=gfx_bat
bat1\lft =0
bat1\up =0
bat1\alive=1
bat1\id =1
bat1\xmax =320
bat1\ymax =240
bat1\xmin =320
bat1\ymin=160
Global bat2.bat=New bat
bat2\frame=0
bat2\x=40
bat2\y=210
bat2\gfx=gfx_bat
bat2\lft =0
bat2\up =0
bat2\alive=1
bat2\id =2
bat2\xmax =40
bat2\ymax =220
bat2\xmin =40
bat2\ymin=60
Global FL.FrameRate = New FrameRate
;initialize frame limiter
FL\TargetFPS# = 30	;set this to whatever FPS your code is based on
FL\FrameDelay = MilliSecs()
;#End Region
;==========================================================================================
;main loop
;#Region main loop
timer=CreateTimer (25)
   While Not KeyHit(1)
        draw_objects
        move_man
        move_bat
        man_fire
        check_collisions
         
        Gosub frame_rate_delay
		Gosub debug
 
   Wend
   End
;#End Region
;==========================================================================================
;functions
Function move_man()	
		
		;movement	
		
		Local fr
		fr=man\frame
		
		If KeyDown(203) Then ;move left
			manleft=1
			man\x=man\x-8* SpeedFactor			
			;keep within frame range
	   			If manfly=0 Then ;walking
	   				man\gfx =gfx_manwalk
	   				fr=fr-1
	   				If fr<0 Then fr=fr+5 ;loop the frame
				Else ;flying
					man\gfx=gfx_manfly
					fr=fr-1
	   				If fr<0 Then fr=0
				End If
		
		ElseIf KeyDown(205) Then ;move right
			manleft=0
		    man\x=man\x+8* SpeedFactor			
			;keep within frame range
	   			If manfly=0 Then ;walking
	   				man\gfx =gfx_manwalk
	   				fr=fr+1
	   				If fr>12 Then fr=fr-5
				Else ;flying
					man\gfx=gfx_manfly
					fr=fr+1
					If fr>4 Then fr=4
				End If
			
		ElseIf KeyDown(200) Then ;move up			
	 			
	 			If KeyDown(205) Then man\x =man\x +8* SpeedFactor
	 			If KeyDown(203) Then man\x =man\x -8* SpeedFactor
	 			
	 			manfly=1 ;flying
				man\y=man\y-8* SpeedFactor ;move 8pixels up
				man\gfx=gfx_manfly ;flying pic
				
				If manflyframechange=0 Then ;when man flys and is using old framecount for walking (0-12)
				
				manflyframechange=1 ;change the frame count for man flying (0-5)
				
				Select True
					
					Case fr >= 0 And fr<= 4		
						fr=0 ;left		
					Case  fr=5
						fr=1 ;left
					Case  fr=6
						fr=2 ;facing you
					Case  fr=7
						fr=3 ;right
					Case  fr=>8 And fr<=12
						fr=4 ;right
					
				End Select
									
				End If
				
		ElseIf manfly=1 ;bring man back to earth! (keep flying image til at ground level)
			
			man\y=man\y+16* SpeedFactor
			If man\y >240 Then ;when man hits ground change graphic and reset flags
				man\y=240 : manfly=0 : man\gfx=gfx_manwalk : manflyframechange=0
				If fr>=3 Then fr=8 ;if frame is manflying right then change to man walking right
			End If
			
		End If
				
		;keep man on screen
		If man\x<0 Then man\x=0
		If man\x >gfx_x-80 Then man\x=gfx_x-80
		If man\y<0 Then man\y=0
		
		man\frame =fr ;change frame of man depending on walking or flying
End Function
Function move_bat()
For b.bat=Each bat
	
If b\alive =1 Then
	
	Local fr=b\frame
		
	If b\up =0 Then ;moving down
		fr=fr+1
		b\y=b\y+2* SpeedFactor
		If fr=>3 Then fr=0
	Else
		fr=fr-1 ;moving up
		b\y=b\y-2* SpeedFactor
		If fr<=0 Then fr=3
	End If
	
	If b\y>b\ymax Then 
		b\y=b\ymax: b\up=1 ;at bottom of screen so move bat up
	End If
	
	If b\y<b\ymin Then
		b\y=b\ymin: b\up=0 ;at top of screen so move bat down
	End If
	
	b\frame=fr
End If
Next
End Function
Function man_fire()
	If KeyDown(57) Then
		
		manfire=1
		
		If manleft=0 Then ;fire to the right
			
			manfirerange=man\x +100
			DrawImage (gfx_manfire,man\x+65 ,man\y+38 ) 
		
		Else	;fire to the left
			
			manfirerange=man\x -100
			DrawImage (gfx_manfire,man\x-115 ,man\y+38 ) 
		
		End If
	Else
		manfirerange=man\x 	
		
		manfire=0
	End If
	
End Function
	
Function draw_objects()
		
		Cls
   		DrawImage gfx_background,0,0
        DrawImage man\gfx,man\x,man\y,man\frame   ;Draw our image
       
       	For bats.bat=Each bat
       	
       		If bats\alive=1 Then
        		DrawImage bats\gfx,bats\x,bats\y,bats\frame
        	End If
        	
        Next
        
End Function
Function check_collisions()
	
For b.bat=Each bat
	
	a=0:c=0
	
	a= ImagesCollide (man\gfx ,man\x,man\y,0,b\gfx,b\x,b\y,0)
	
	Text(6,400,a)
	
		If manfire=1 Then
		
			c= ImagesCollide (gfx_manfire,manfirerange,man\y+35,0,b\gfx,b\x,b\y,0)
			Text(6,412,c)
		
				If c=1 Then b\alive =0
		End If
Next
End Function
;frame rate 
;#Region frame rate
.frame_rate_delay
;Set Speed Factor
FL\CurrentTicks = MilliSecs()
FL\SpeedFactor# = (FL\CurrentTicks - FL\FrameDelay) / (1000.0 / FL\TargetFPS#)
speedfactor=FL\SpeedFactor
;If FL\SpeedFactor# <= 0 Then FL\SpeedFactor# = no0#
	
FL\TimeElapsed# = (FL\CurrentTicks - FL\FrameDelay) / 1000.0
If Debug
	
	FL\FPS# = (FL\FPS2# + FL\FPS3# + FL\FPS4# + FL\FPS5# + FL\TargetFPS# / FL\SpeedFactor#) / 5
	FL\FPS5# = FL\FPS4# : FL\FPS4# = FL\FPS3# : FL\FPS3# = FL\FPS2# : FL\FPS2# = FL\FPS#
EndIf
FL\FrameDelay = FL\CurrentTicks
Return
;#End Region
;debug
;#Region debug
.debug
Local x,y
x=6:y=340
Text(x,y,"speed factor="+SpeedFactor)
y=y+12
Text(x,y,"man_x:"+man\x+" man_y:"+man\y+" man:"+man\frame+" fly:"+manfly +" frchange:"+manflyframechange )
y=y+12
For b.bat=Each bat
	Text(x,y,"bat id:"+ b\id +" x:"+b\x+" y:"+b\y+" fr:"+b\frame+" alive:"+b\alive)
	y=y+12
	
Next
Flip
Return
;#End Region============================================================== OK, I must apologize because my code I posted had an error in it. This is what it read: ;example usage of SpeedFactor# ;let's say your player normally moves 5 pixels (or units) per frame If KeyDown(205) PlayerX = PlayerX + 5.0 * SpeedFactor# EndIfand this is what it should have been: ;example usage of SpeedFactor# ;let's say your player normally moves 5 pixels (or units) per frame If KeyDown(205) PlayerX = PlayerX + 5.0 * FL\SpeedFactor# EndIfNotice the FL\ in front of SpeedFactor# ? So looking back at your code, I see that you created a variable named SpeedFactor. Two problems with that. First, it's not the one that the frame-limiting code is updating. You should be using FL\SpeedFactor#. Second, your variable wasn't even a float (doesn't have the # symbol, therefore it's an integer). This is most likely why it ran fast, because instead of the SpeedFactor equaling something like 0.36 it rounded it down to 0. erase this line: Global SpeedFactorand this line: speedfactor=FL\SpeedFactor and change all references in your code from SpeedFactor to FL\SpeedFactor#. (Use the Replace feature, it will make it easy) By the way, you don't need to create a timer when using the frame limiting code I gave you timer=CreateTimer (25)so delete that line as well. | 
| 
 | ||
| When I got home, I tried your game out with the changes I suggested and it worked fine. Nice graphics you got there... | 
| 
 | ||
| thanks for your help thats great the frame changes too fast when the man is walking so i need to slow that otherwise looking good also the graphics I pinched from another game, just 'borrowing' them while I get used to blitz :) |