Acceleration - Deceleration
Acceleration - Deceleration
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
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
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
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
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)
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
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
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
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

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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
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
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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

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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
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 ?

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 ?

Tu ne travaillerais pas dans les pneus par hasard ?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

C'est ce que l'on appelle la notion de limite en math !Dobro a écrit :ben d'apres les maths on ne touche jamais le mur !!!!
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 !!!

Code : Tout sélectionner
v = (a - f) + v
et donc plus ça frotte , plus on recule vite ?v=v-f
exact , moi je prends f comme une constante , alors qu'ici il faut faire
j'ai repris mon code avecf=k*v²
alors cette fois ci , où est mon erreur ?f = k * v² (k est une constante qui caractérise le frottement)
v = (a - f) + v
e = v + e
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
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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)
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]