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 :) |