Acceleration - Deceleration

Programmation avancée de jeux en PureBasic
eRz0r
Messages : 30
Inscription : ven. 14/janv./2005 17:42

Acceleration - Deceleration

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

la dynamique, c'est des maths, non ? des grosses équations à résoudre très amusantes :lol:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
eRz0r
Messages : 30
Inscription : ven. 14/janv./2005 17:42

Message par eRz0r »

Oki merci, je vais me debrouiller avec tout ça maintenant ;)

eRz
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 ?
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre