Page 1 sur 2

Acceleration - Deceleration

Publié : ven. 14/janv./2005 17:48
par eRz0r
Hello, donc en fait je suis en train de coder un petit jeu de moto en 2D vue de profil un peu comme sur :

http://www.miniclip.com/trialscy/trialscy.htm

Seulement voilà mon problème. Je n'ai aucune idee de comment creer une acceleration du sprite quand on appuie sur fleche UP et une deceleration de ce sprite si ce fleche UP est relaché.

J'ai essayé un truc genre :

If keyboardpushed(#PB_key_up)
x.f*1.01
endif

Sachant que X represente la coordonné X de mon sprite sur l'ecran, je sais c'est barbar mais j'ai aucune idee de comment faire, je pense qu'il faut d'autres variables tel que vitesseX etc.. na ?

eRz

Publié : ven. 14/janv./2005 20:24
par comtois
je ne sais pas si c'est un truc de ce genre que tu cherches à faire ?
modifie les valeurs de Joueur\acceleration , ou Joueur\CoefFrottement
pour tester .
tu peux aussi valider la ligne

Code : Tout sélectionner

  ;Joueur\PositionX+(Joueur\Vitesse*dt)
et mettre en commentaire celle ci , et cherche les bons paramètres

Code : Tout sélectionner

 Joueur\PositionX+(Joueur\Vitesse)

Code : Tout sélectionner

;-Declare 
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 
;-Structures 
Structure Joueur 
  CoefFrottement.f
  Acceleration.f 
  Vitesse.f 
  PositionX.f
EndStructure 
Global Joueur.Joueur 
Global dt.f

;-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.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\Acceleration=-3 
    ElseIf KeyboardPushed(#PB_Key_Right) 
      Joueur\Acceleration=3
    Else
    Joueur\Acceleration=0
    EndIf 
  EndIf 
EndProcedure 

Procedure CalculDeplacement() 
  ;change cette valeur pour modifier le frottement 
  Joueur\CoefFrottement=0.9
  Joueur\Vitesse+(Joueur\Acceleration*dt)
  Joueur\Vitesse/(1+(Joueur\CoefFrottement*dt))
  ;Joueur\PositionX+(Joueur\Vitesse*dt)
  Joueur\PositionX+(Joueur\Vitesse)
EndProcedure 
;- Boucle principale 
Temps = ElapsedMilliseconds() 
Repeat 
  ClearScreen(0,0,0) 
  ;/Calcul le temps d'affichage d'une image en seconde 
  dt=(ElapsedMilliseconds()-Temps)/1000
  Temps=ElapsedMilliseconds()  

  ;/Test le clavier 
  Touches() 
  ;/Affiche le sprite 
  CalculDeplacement()
  DisplaySprite(1,Joueur\PositionX,300) 
  
  FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape) 
End 
ou alors si tu ne veux pas te faire engueuler par marcus parce que ce n'est pas fluide ,tu ajoutes le setrefreshtruc qui va bien ( je ne l'ai pas mis )
et tu fixes dt

Code : Tout sélectionner

-Declare 
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
EndStructure 
Global Joueur.Joueur 
Global dt.f

;-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.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\Acceleration=-1 
    ElseIf KeyboardPushed(#PB_Key_Right) 
      Joueur\Acceleration=1
    Else
    Joueur\Acceleration=0
    EndIf 
  EndIf 
EndProcedure 

Procedure CalculDeplacement() 
  dt=0.8
  ;change cette valeur pour modifier le frottement 
  Joueur\CoefFrottement=0.1
  Joueur\Vitesse+(Joueur\Acceleration*dt)
  Joueur\Vitesse/(1+(Joueur\CoefFrottement*dt))
  Joueur\PositionX+(Joueur\Vitesse*dt)
  ;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 

Publié : ven. 14/janv./2005 21:10
par Le Soldat Inconnu
a : acceleration en m/s²
v : vitesse em m/s
v0 : vitesse initiale
e0 : distance initiale
e : distance en m
t : temps en s

voici les formules de l'évolution de la distance et de la vitesse
e = 1/2 * a * t² + v * t + e0
v = a * t + v0

en clair et en simplifiant : pour faire une accélération, on effectue ceci à chaque tour de boucle du jeux

a = cte (ou une variable qui change, par exemple, en fonction de comment on appuie sur l'accélérateur)
la vitesse varie de cette façon
v = a + v
et la position comme suit
e = v + e

un frottement se traduit par un décélération qui augmente avec la vitesse au carré en général (par exemple, le frottement de l'air)
f = k * v² (k est une constante qui caractérise le frottement)
v = (a - f) + v
e = v + e

allez finit les maths :wink:

Publié : ven. 14/janv./2005 21:27
par Guimauve
allez finit les maths
Des calculs de position, vitesse et accélération sont plutôt des calculs de Dynamique que de simple calculs de maths ?

A+
Guimauve

Publié : ven. 14/janv./2005 21:59
par Le Soldat Inconnu
la dynamique, c'est des maths, non ? des grosses équations à résoudre très amusantes :lol:

Publié : ven. 14/janv./2005 22:54
par Guimauve
Oui, avec des Intégrales, dérivées, etc.

C'est sûr que c'est des maths. Mais pour moi, c'est plus intéressant les calculs de physique que les calculs de maths généraux. :D

Au moins ça sert à quelque chose d'utile. Surtout pour un ingénieur en mécanique. Statique - Dynamique - Cinématique - Etc.

A+
Guimauve

Publié : ven. 14/janv./2005 23:23
par Le Soldat Inconnu
Mais à la base, les maths ne servent que a ça, c'est juste que en cours, on nous basine avec des maths "idiots" :wink:
Mais je suis entièrement d'accord, y'a que dans ce contexte que les maths sont amusants

Publié : sam. 15/janv./2005 0:00
par Backup
oui mais les math ça deconne parfois :D


je suis a 1 Metre du mur , pour arriver a le toucher je parcour au moins la moitié de la distance qui me separe de ce mur soit 100 cm/2= 50 cm , je suis donc a 0,50 metre du mur

pour toucher mon mur je doit au moins encore parcourir la moitie de la distance qui me separe du mur , soit 0.50 /2 =0.25 ect...

ben d'apres les maths on ne touche jamais le mur !!!! :lol:

car la moitié de la distance a parcourir a chaque fois , fait que l'on ne tombe
jamais juste , c'est bete hein ? :D

Publié : sam. 15/janv./2005 10:11
par eRz0r
Oki merci, je vais me debrouiller avec tout ça maintenant ;)

eRz

Publié : sam. 15/janv./2005 11:28
par Dräc
Le Soldat Inconnu a écrit :un frottement se traduit par un décélération qui augmente avec la vitesse au carré en général (par exemple, le frottement de l'air)
f = k * v² (k est une constante qui caractérise le frottement)
v = (a - f) + v
e = v + e
Tu ne travaillerais pas dans les pneus par hasard ? :D
Dobro a écrit :ben d'apres les maths on ne touche jamais le mur !!!!
C'est ce que l'on appelle la notion de limite en math !
Oui car 0.999999...9999... avec une infinité de 9 après la virgule et bien c'est 1 !!!
Et puis avec tes gros souliers, tu touches forcement le mur !!! :lol:

Publié : sam. 15/janv./2005 11:38
par comtois

Code : Tout sélectionner

v = (a - f) + v 
tu me reprends si je me trompe mais , si a=0 , on a
v=v-f
et donc plus ça frotte , plus on recule vite ?

Publié : sam. 15/janv./2005 11:59
par Dräc
Rappelles toi que le frottement dépend aussi de la vitesse et que par conséquent il tend tout simplement à annuler la vitesse (de plus, la vitesse étant au carré, la force de frottement décroit plus vite.).

v=v-f signifie donc simplement que l’on décélère.

Publié : sam. 15/janv./2005 12:17
par comtois
exact , moi je prends f comme une constante , alors qu'ici il faut faire
f=k*v²
j'ai repris mon code avec
f = k * v² (k est une constante qui caractérise le frottement)
v = (a - f) + v
e = v + e
alors cette fois ci , où est mon erreur ?

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 
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 
    ElseIf KeyboardPushed(#PB_Key_Right) 
      Joueur\Acceleration=1 
    Else 
    Joueur\Acceleration=0 
    EndIf 
  EndIf 
EndProcedure 

Procedure CalculDeplacement() 
  ;f=k*v² ( k=0.09)
  Joueur\CoefFrottement=0.09 * Joueur\Vitesse*Joueur\Vitesse
  ;v=(a-f)+v
  Joueur\Vitesse+Joueur\Acceleration-Joueur\CoefFrottement
  ;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 

Publié : sam. 15/janv./2005 12:31
par Dräc
Dans les équations, c’est la norme des vecteurs qui est en jeu.
Tu ne peux donc pas avoir de vitesse négative.
Si ton frottement est important, le résultat c’est que tu ne peux plus avancer et pas autre chose.

Tu dois intégrer la notion de direction pour reconstituer ton vecteur.

Publié : sam. 15/janv./2005 23:30
par Le Soldat Inconnu
Oui, ton frotemment ne prend pas en comptes la direction du déplacement
il empeche toujours d'aller de la gauche vers la droite mais de la droite vers la gauche, ton frottement se tranforme en accélération.

ici, j'ai ajouté une variable de sens de deplacement + ou - que je multiplie aux accélérations (toujours en positif) et aux décélérations (toujours en négatif)

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
  ; 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