Gestion du temps dans les jeux

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Gestion du temps dans les jeux

Message par comtois »

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