Pour revenir à ce que j'ai dit auparavant, k * v², c'est l'air
je trouvais qu'il manquait une composante dans la déccélération
ça rend mieux avec les 2 composantes
Code : Tout sélectionner
Declare Erreur(Message$)
;{- Constantes
#ScreenWidth = 800
#ScreenHeight = 600
#ScreenDepth = 32
;- 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
SetFrameRate(70)
;- Structures
Structure Joueur
CoefFrottement.f
Acceleration.f
Vitesse.f
PositionX.f
Sens.b
EndStructure
Global Joueur.Joueur
;- Sprites
;/ Joueur
CreateSprite(1, 32, 32)
If StartDrawing(SpriteOutput(1))
Box(0, 0, 32, 32, RGB(100, 150, 140))
StopDrawing()
EndIf
;- Procedures
Procedure Erreur(Message$)
MessageRequester( "Erreur", Message$, 0 )
End
EndProcedure
Procedure Touches()
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
Joueur\Acceleration = 1
Joueur\Sens = -1
ElseIf KeyboardPushed(#PB_Key_Right)
Joueur\Acceleration = 1
Joueur\Sens = 1
Else
Joueur\Acceleration = 0
EndIf
EndIf
EndProcedure
Procedure CalculDeplacement()
; f=k*v² ( k=0.09)
Joueur\CoefFrottement = 0.09 * Joueur\Vitesse * Joueur\Vitesse + 0.07 * Abs(Joueur\Vitesse)
; v=(a-f)+v
Joueur\Vitesse + (Joueur\Acceleration - Joueur\CoefFrottement) * Joueur\Sens
; e=e+v
Joueur\PositionX + Joueur\Vitesse
EndProcedure
;- Boucle principale
Temps = ElapsedMilliseconds()
Repeat
ClearScreen(0, 0, 0)
;/ Test le clavier
Touches()
;/ Affiche le sprite
CalculDeplacement()
DisplaySprite(1, Joueur\PositionX, 300)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End