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
et mettre en commentaire celle ci , et cherche les bons paramètres
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

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

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.
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"
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
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 !!!!
car la moitié de la distance a parcourir a chaque fois , fait que l'on ne tombe
jamais juste , c'est bete hein ?

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 ?
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 !!!

Publié : sam. 15/janv./2005 11:38
par comtois
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