Code archives/Miscellaneous/Speed of the turns/moves/animations automatically adjusted to appear constant whatever the FPS
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This allows your program to run at the same speed whatever the FPS, whatever is drawn on screen, whatever the computer hardware | |||||
;Speed of the turns/moves/animations automatically adjusted to appear constant whatever the FPS
;
;This code shows a way to have an automatic adjustment of the speed of the turns/moves/animations
;so that the program appears to run at the same speed, whatever the FPS, whatever is drawn on screen, whatever the hardware of the computer/graphics card.
;The variable SC# must be applied to all turns/moves/animations. See the example.
;I have tested this code on several computers with different hardwares and os and it seems to work as expected.
;There may be inaccuracies if there is less than 10fps but overall it works well.
Graphics3D(800,600,32,2)
HidePointer()
SeedRnd(MilliSecs())
Origine = CreateCube()
ScaleMesh(Origine,0.1/2,100,0.1/2)
EntityColor(Origine,125,000,000)
EntityAlpha(Origine,0.5)
EntityFX(Origine,1)
PositionEntity(Origine,0,0,0)
Target = CreateCube()
ScaleMesh(Target,0.1/2,100,0.1/2)
EntityColor(Target,250,000,000)
EntityAlpha(Target,0.5)
EntityFX(Target,1)
PositionEntity(Target,0,0,128)
GroundMesh = CreatePlane()
PositionEntity(GroundMesh,0,0,0)
EntityColor(GroundMesh,050,050,050)
Camera = CreateCamera()
CameraRange(Camera,0.1,1000)
CameraClsColor(Camera,063,125,250)
PositionEntity(Camera,0,0,0)
CharacterMesh = CreateCube()
ScaleMesh(CharacterMesh,0.5/2,1.7/2,0.25/2)
PositionMesh(CharacterMesh,0,1.7/2,0)
HideEntity(CharacterMesh)
Global PlayerFeet = CreatePivot()
Global PlayerEyes = CreatePivot()
MoveEntity(PlayerEyes,0,1.6,0.1+0.1)
EntityParent(PlayerEyes,PlayerFeet,True)
Global PlayerMesh = CopyMesh(CharacterMesh)
EntityColor(PlayerMesh,000,000,250)
EntityParent(PlayerMesh,PlayerFeet,True)
PositionEntity(Camera,EntityX(PlayerEyes,True),EntityY(PlayerEyes,True),EntityZ(PlayerEyes,True))
RotateEntity(Camera,EntityPitch(PlayerEyes,True),EntityYaw(PlayerEyes,True),EntityRoll(PlayerEyes,True))
MoveEntity(Camera,0,0,-1.5)
EntityParent(Camera,PlayerEyes,True)
TurnEntity(PlayerEyes,22.5,0,0)
Global BotsCount% = 0
Dim BotFeet(10000)
Dim BotMesh(10000)
For i% = 1 To 1000 ;change this value to 1 or 10 or 100 or 1000 or more to see how the speed of the turns/moves are automatically adjusted so that it appears to run at the same speed whatever the FPS, whatever is drawn on screen.
BotsCount = BotsCount + 1
BId% = BotsCount
BotFeet(BId) = CreatePivot()
BotMesh(BId) = CopyMesh(CharacterMesh)
EntityColor(BotMesh(BId),Rand(025,250),Rand(025,250),Rand(025,250))
EntityParent(BotMesh(BId),BotFeet(BId),True)
PositionEntity(BotFeet(BId),Rnd(-30,30),0,Rnd(10,90))
RotateEntity(BotFeet(BId),0,Rnd(-180,180),0)
Next
SLight = CreateLight(1)
LightColor(SLight,255,255,255)
PositionEntity(SLight,-1000,1000,-1000)
RotateEntity(SLight,45,-45,0)
AmbientLight(050,050,050)
MillisecOld% = MilliSecs()
MillisecCur% = MilliSecs()
SecsCount% = 0
FramesCount% = 0
FramesTotalCount% = 0
FramesPerSecond% = 0
Global SC# = 1.0
While(KeyDown(1)<>1)
MainLoopStart% = MilliSecs()
UpdateBots()
UpdatePlayer()
If( EntityZ(PlayerFeet) >= EntityZ(Target) )
ClsColor(000,000,000)
Cls()
Locate(0,0)
Print("Average FramesPerSecond (FPS) = "+FramesTotalCount/SecsCount)
Print("Seconds passed during the travel = "+SecsCount)
FlushKeys()
WaitKey()
Goto LineExitGame
EndIf
SetBuffer(BackBuffer())
RenderWorld()
MillisecCur = MilliSecs()
If(MillisecCur < MillisecOld + 1000)
FramesCount = FramesCount + 1
ElseIf(MillisecCur >= MillisecOld + 1000)
FramesPerSecond = FramesCount
FramesTotalCount = FramesTotalCount + FramesCount
FramesCount = 0
SecsCount = SecsCount + 1
MillisecOld = MillisecCur
EndIf
Text(0,0,"Triangles = "+TrisRendered())
Text(0,20,"MainLoopTime = "+MainLoopTime)
Text(0,40,"FramesCount = "+FramesCount)
Text(0,60,"FramesPerSecond (FPS) = "+FramesPerSecond)
Text(0,80,"FramesTotalCount = "+FramesTotalCount)
Text(0,100,"SC = "+SC)
Text(0,120,"SecsCount = "+SecsCount)
Text(0,140,"See how the speed of the turns/moves are automatically adjusted so that ")
Text(0,160,"it appears to run at the same speed, whatever the FPS, whatever is drawn on screen.")
Flip(True)
MainLoopTime% = MilliSecs() - MainLoopStart
If(MainLoopTime < 1)
MainLoopTime = 1
EndIf
SC = Float(30) / 1000 * MainLoopTime
Wend
.LineExitGame
EndGraphics()
End()
Function UpdatePlayer()
MoveEntity(PlayerFeet,0,0,0.2*SC)
End Function
Function UpdateBots()
For BId% = 1 To BotsCount
TurnEntity(BotFeet(BId),0,2.0*SC,0)
MoveEntity(BotFeet(BId),0,0,0.2*SC)
Next
End Function |
Comments
| ||
| Amazing! thanks! |
Code Archives Forum