ElapsedTime, Mouvement & Animations !

ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010 - 6 sept. 2005 à 15:21
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010 - 10 oct. 2005 à 12:50
Salut, j'ai un petit problème qui me semble venir de ma variable ElapsedTime contenant le temps qui s'est écoulé depuis la dernière frame. Enfaite quand je n'utilise pas cette variable pour les animations celles-ci sont fluide mais dépendent du FrameRate, c'est pourquoi je doit utiliser la variable ElapsedTime, pour que les mouvements et animations ne dépendent que du temps. Mon problème c'est que qu'en j'utilise la variable ElapsedTime les mouvements de mon personnage (je fais un First Person Shooter) saccade ou parfoit vont trop vite, de brusques avancé ou des ralentissement, qui ne se passent pas si je ne met pas la variable ElapsedTime. La variable ElapsedTime est calculé grace à la fonction DXUtil_Timer (TIME_GETELAPSEDTIME) fournit avec le DirectX9 App Wizard, je n'utilise pas le App Wizard j'y est juste pris cette fonction qui me parraissait bien pratique pour calculer le temps. Si quelqu'un sait comment faire pour que les mouvements et animations ne saccade plus à cause de ElapsedTime, sa serait simpa de m'en faire pars. Merci d'avance ++

Oxyde

29 réponses

Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
6 sept. 2005 à 17:55
bah ... pffff... bizarre... tu devrais refaire cette fonction pour voir
si ca marche mieux, meme avec un simple time(), pas tres precis mais ca
suffit.... sinon bah c'est ton code qui buggue... mais juste comme ca
que dire de plus...

_______________________

Omnia vincit labor improbus
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 sept. 2005 à 18:38
Utilises elapsedTime mais défini un temps minimum entre chaque frame pour traiter le deplacement

( qui sera du genre ) pos += elapsedtime*vitesse * K; // K étant ta constante qui te permet de "mettre à l'échelle" :)
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 sept. 2005 à 18:41
Pour le temps minimum je pense que 10ms suffisent : en gros



tempsdepuisderniertraitement += elaspedtime ;



if ( tempsdepuisderniertraitement > 10 ms )

{

tempsdepuisderniertraitement = 0 ;

pos += tempsdepuisderniertraitement*vitesse * K;



//ta boucle

}
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
6 sept. 2005 à 19:05
hum ouais pas bete, c'est ptet que ca va trop vite les données fournies
par ton timer ne sont pas assez précises...par contre ton exemple je
m'aime pas trop moddib....pour un limitateur de fps va voir ici... ca
le bloque a 50 en libérant le CPU autant que possible



http://www.cppfrance.com/code.aspx?ID=30855



++

ad

_______________________

Omnia vincit labor improbus
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 sept. 2005 à 20:53
J'ai maté vite fait mais je n'ai pas le temps de m'y attarder longtemps
( jamais touché a la sdl ) tu pourrais m'expliquer en gros ton
idée ?

Parce que je ne vois pas non plus trop l'intérêt de libérer du CPU dans
un jeu, c'est que faut les faire bosser ces petites machines ^^ ?!?
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
6 sept. 2005 à 21:12
ca n'a rien a voir avec la sdl, qui ne me sert que pour le fenetrage.
si je m'en sers pour le timer ( je ne me souviens plus trop) libre a
toi d'en utiliser un autre, justement sur le sommaire en ce moment ya
une source qui en propose 3

le but d'un limitateur de fps est ded faire tourner le PC au maximum utile.

c'est a dire qu'un P4 serait tout a fait capable d'afficher un 'tit
cube texturé a 500fps ou plus, seulement c'est stupide: l'écran , lui ,
ne peut pas en afficher plus que 50... (ou 60 ca dépend de ce que tu as
choisi)

donc on affiche une frame, et on fait un Sleep() jusqu'a ce qu'il soit temps de dessiner la frame suivante.

ca a en plus l'avantage de libérer le proco , qui pourra alors s'occuper d'autres petites choses.

remarque que si ton prog est multithreadé, les threads ne seront pas concernés par ce Sleep() enfin ca c'est a toi de voir

++
_______________________

Omnia vincit labor improbus
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
6 sept. 2005 à 21:26
Ok merci c'est ce que je pensais mais je trouvais la méthode du sleep trop bourrine :) mais si tu dis que c'est viable !

Merci Arnaud
0
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
7 sept. 2005 à 00:51
Non mon code est bon je pense vu que avec une constante à la place de ElapsedTime le mouvement est fluide, je pense qu'il y a un problème au niveau du calcul du temps alors je vais essayer avec les bonnes vieilles méthodes et je vous informes de l'évolution, merci pour les réponses si vite ++

Oxyde
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
7 sept. 2005 à 11:40
Evidemment que ton code est fluide avec une
constante......malheureusment sur toutes les machines il ne se passera
pas la même chose !

Alors pour avoir quelque chose de fluide et de pro essais ce que je te dis :p
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
7 sept. 2005 à 13:55
oui oui... essaye sur un autre PC t'auras des surprises :p

_______________________

Omnia vincit labor improbus
0
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
7 sept. 2005 à 21:16
lol je sais très bien que sur une basse config vu que la vitesse des mouvements est basé sur le FPS les mouvements seront beaucoup plus lents. Quand a ton truc MoDDiB je l'est fais mais avec un temps minimum beaucoup plus petit surement trop petit alors je vais déja tester de mettre 10ms et apres si sa ne marche tj pas de changé la fonction calculant le temps.


Pour expliquer pourkoi un limiteur de fps irait parceque je croi que MoDDib avait pas bien compris c'est que si on limite les frame alors la variable ElapsedTime serait beaucoup plus grande et ne poserai peut etre donc plus de problème, mais bon je ne compte pas utiliser de limiteur de frame pour pouvoir analyser les performances de mon jeu..


Merki quand même pour les idées je vais tout essayer @+

Oxyde
0
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
7 sept. 2005 à 21:24
Oui c bon merki beaucoup j'ai régler le temps minimum entre chaque frame a 10ms (eh oui bien en faite s'est un limiteur mais bon pas grave je peux quand même voir l'évolution de mon fps alors sa va...) enfaite c'était vraiment tout bete merci ++

Oxyde
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
7 sept. 2005 à 22:01
pas de quoi :p

_______________________

Omnia vincit labor improbus
0
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
9 sept. 2005 à 11:58
heu.. je sais pas si c'est ca que tu as fais mais j'ai un exemple si tu veux pour pouvoir avoir des déplacements indépendants du frame rate.

bool Display(float timeDelta){

If (Device){

if (GetAsyncKeyState('S') & 0x8000f)
TheCamera.walk(-4.0f * timeDelta); [file://TheCamera/ \\TheCamera] est un objet d'une class camera à moi...

...................................je vais pas le faire pour toutes les touches.

D3DMATRIX V;

TheCamera.GetViewMatrix(&V);
Device->SetTransform(D3DTS_VIEW,&V);

//
// Render
//
}
return true;
}

Je sais pas du tout si ca pourra vous aider... mais n'hésiteez pas à demander si quelques chose n'est pas clair ou si vous voulez des explications sur la class camera...
bye
0
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
10 sept. 2005 à 13:34
Ouai j'ai fait quelque chose dans ce genre pour le déplacement je te remercie je crois ne plus avoir de problèmes pour le déplacement, par contre la vue géré par le déplacement de la souris est soumis au FPS et non au temps mais sa par contre je sais pas qu'est ce qu'il faut multiplier par ElaspedTime, voila comment je gere la vue :
Un objet POINT MoveMouse m'enregistre les déplacements de la souris, qui à chaque frame est recentré au milieu de l'écran apres ce calcul. Si l'on déplace la souris a droite MoveMouse.x sera par exemple = à 10, puis si on la redéplace encore a droite a 20 encore, bien sur tout dépend à quelle vitesse on la déplace dans ce cas la valeur change. Le vecteur direction de la vue est calculé avec cosf sinf et tanf de MoveMouse, mais ma question c'est où que je doit mettre mon ElapsedTime pour rendre mon scrolling indépendant de mon FPS ? (Si vous voulez mes morceaux de codes n'hésitez pas à demander)

Oxyde
0
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
10 sept. 2005 à 13:37
J'ai oublié de dire que j'ai tester sur un autre ordi et la vue souris trembe quand on la déplace. Problème lié au FPS ? En tout cas il faut se débarrasser de cette indépendance oui ou non ?

Oxyde
0
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
10 sept. 2005 à 23:21
Bon sinon comment on fait pour regarder autour de soir avec la souris (je n'utilise pas les matrices aufaite (non ne me tapez pas :'>)) ?

Oxyde
0
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
11 sept. 2005 à 18:20
Oxyde
0
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
11 sept. 2005 à 21:04
heu... je vais me pencher là dessus... (dsl j'ai bcp de boulot en ce moment) mé alors là... je vois pas comment tu peux faire sans matrice lol.
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
11 sept. 2005 à 21:49
Evidemment que tu dois te débarrasser de toutes les indépendances :
sinon sur la prochaine génération d'ordinateur ton jeu sera injouable
:) et sur l'ancienne aussi d'ailleurs :)

Ensuite sur le comment ça dépends de comment tu bouges le tout et si tu
sais arriver jusque la tu dois savoir où ajouter le elapsed time !
0
Rejoignez-nous