Code : Tout sélectionner
;Comtois
;13/01/05
;Gestion du FPS dans les jeux
;Ce code est inspiré de cet article
;http://www.nofrag.com/2004/oct/23/14529/
;-Declare
Declare Erreur(Message$)
;{-Constantes
#ScreenWidth = 800
#ScreenHeight = 600
#ScreenDepth = 32
#NbTileX=25
#NbTileY=19
Enumeration
#Joueur
#Glace
#Herbe
#Terre
EndEnumeration
;-Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
Erreur("Impossible d'initialiser DirectX 7 Ou plus")
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "" ) = 0
Erreur("Impossible d'ouvrir l'écran ")
EndIf
;-Structures
Structure Joueur
ValVitesse.f
VitesseX.f
VitesseY.f
x.f
y.f
EndStructure
Global Joueur.Joueur
Global dt.f,Dt_Jeu.f ,Delta.f
Dim Map(#NbTileX,#NbTileY)
Dim Tile.f(3) ; Coef de frottements des tiles
Tile(#Glace)=0.97 ; Glace
Tile(#Herbe)=0.85 ; Herbe mouillée
Tile(#Terre)=0.75 ; Terre sèche
Joueur\ValVitesse=2
;Vitesse du jeu ( Exemple: 10 ms pour une image donne un FPS de 100 )
Dt_Jeu=15 ;changez cette valeur pour ralentir ou accélérer le jeu.
;-Sprites
;/Joueur
CreateSprite(#Joueur,32,32)
If StartDrawing(SpriteOutput(#Joueur))
Box(0,0,32,32,RGB(100,150,140))
StopDrawing()
EndIf
;/Glace
CreateSprite(#Glace,32,32)
If StartDrawing(SpriteOutput(#Glace))
Box(0,0,32,32,RGB(100,100,190))
StopDrawing()
EndIf
;/Herbe mouillée
CreateSprite(#Herbe,32,32)
If StartDrawing(SpriteOutput(#Herbe))
Box(0,0,32,32,RGB(100,190,100))
StopDrawing()
EndIf
;/Terre sèche
CreateSprite(#Terre,32,32)
If StartDrawing(SpriteOutput(#Terre))
Box(0,0,32,32,RGB(70,0,0))
StopDrawing()
EndIf
;/Map
For v=0 To #NbTileY-1
For u=0 To #NbTileX-1
Read Tile
Map(u,v)=Tile
Next u
Next v
;-Procedures
Procedure Erreur(Message$)
MessageRequester( "Erreur" , Message$ , 0 )
End
EndProcedure
Procedure.f Min(actuelle.f,Cible.f)
If Cible<actuelle
ProcedureReturn Cible
Else
ProcedureReturn actuelle
EndIf
EndProcedure
Procedure Touches()
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
Joueur\VitesseX=-Joueur\ValVitesse
ElseIf KeyboardPushed(#PB_Key_Right)
Joueur\VitesseX=Joueur\ValVitesse
EndIf
If KeyboardPushed(#PB_Key_Up)
Joueur\VitesseY=-Joueur\ValVitesse
ElseIf KeyboardPushed(#PB_Key_Down)
Joueur\VitesseY=Joueur\ValVitesse
EndIf
EndIf
EndProcedure
Procedure AffMap()
For v=0 To #NbTileY-1
For u=0 To #NbTileX-1
DisplaySprite(Map(u,v),u*32,v*32)
Next u
Next v
EndProcedure
Procedure CalculDeplacement()
;/Positions sur la map
PosX=Joueur\x/32
PosY=Joueur\y/32
;/Frottement du tile
f.f=Tile(Map(PosX,PosY))
;/calcul le déplacement du joueur
Joueur\x+Joueur\VitesseX
Joueur\y+Joueur\VitesseY
;/Applique le coef de frottement selon le tile sur lequel se trouve le joueur
Joueur\VitesseX*f
Joueur\VitesseY*f
EndProcedure
Procedure TestCollision()
;/Test collision avec le bord de l'écran
If Joueur\x>#ScreenWidth-32
Joueur\x=#ScreenWidth-32
EndIf
If Joueur\y>#ScreenHeight-32
Joueur\y=#ScreenHeight-32
EndIf
If Joueur\x<0
Joueur\x=0
EndIf
If Joueur\y<0
Joueur\y=0
EndIf
;/Mettre ici les collisions avec l'environnement (murs , etc )
EndProcedure
;- Boucle principale
Temps = ElapsedMilliseconds()
Delta=Dt_Jeu
FPS=0
Repeat
ClearScreen(0,0,0)
;/Calcul le temps d'affichage d'une image
If ElapsedMilliseconds()-Temps>1000
Temps = ElapsedMilliseconds()
Delta=1000.0/FPS
FPS=0
Else
FPS+1
EndIf
;/limite la valeur pour éviter des écarts importants si le jeu se bloque
;Delta=Min(Delta,50)
;/Temps Réel
dt+Delta
;/Affiche les sprites
AffMap()
DisplaySprite(0,Joueur\x,Joueur\y)
;/Affiche le temps d'affiche pour une image
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(255,255,255)
Locate(0,0)
DrawText(StrF(Delta,2))
StopDrawing()
;/Test le clavier
Touches()
;/Calcul le moteur du jeu
While dt>Dt_Jeu
CalculDeplacement()
TestCollision()
dt-Dt_Jeu
Wend
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
DataSection
Data.l 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
Data.l 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
Data.l 3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,3,3,3,3,3,3
Data.l 3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3
Data.l 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
Data.l 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
Data.l 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
Data.l 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3