Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Probleme pour temporiser  (Lu 4175 fois)

0 Membres et 1 Invité sur ce sujet

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Probleme pour temporiser
« le: Août 28, 2012, 09:23:10 pm »
Bonsoir, deja je prefere prevenir, je suis debutant en C++ et en SFML donc il est tout a fait possible que
j'ai oublie un truc tout con. je suis sous SFML 1.6.

voila mon probleme : je n'arrive pas a rendre le comportement de la gravite independant du nombre d'images par secondes dans ce code :

#include "cl_personnage.hpp"


void Personnage::Sauter()
{
        if(Flag_contact_bas == true)
                Vitesse_verticale = -IMPULSION_SAUT;
}


void Personnage::Droite()
{
        if(Flag_nage == false)
                Vitesse_horizontale = VITESSE_PERSONNAGE;
        else
                Vitesse_horizontale = VITESSE_PERSO_NAGE;
}


void Personnage::Gauche()
{
        if(Flag_nage == false)
                Vitesse_horizontale = -VITESSE_PERSONNAGE;
        else
                Vitesse_horizontale = -VITESSE_PERSO_NAGE;
}


void Personnage::Gravite(float& ElapsedTime)
{
        // gravite "realiste"
        if((Flag_contact_bas == false) & (Vitesse_verticale <= Vitesse_max))
                Vitesse_verticale += (FORCE_GRAVITE*ElapsedTime);

        // alternance de vitesse pour dissocier la gravite dans l'eau et dans l'air
        if(Flag_nage == true)
        {
                Vitesse_max = VITESSE_MAX_NAGE;

                if(Vitesse_verticale >= Vitesse_max)
                        Vitesse_verticale = 1;
        }
        else
                Vitesse_max = VITESSE_MAX;

        Sprite_perso->Move(0, Vitesse_verticale);
}


void Personnage::Mouvement(float& ElapsedTime)
{
        Sprite_perso->Move(ElapsedTime * Vitesse_horizontale, ElapsedTime * Vitesse_verticale);
        Vitesse_horizontale = 0;
}
 


alors que les deplacements droite gauche oui.

ca me rendrait un sacre service si vous pouviez trouver de quoi il s'agit !

quelques precisions, je ne retouche pas a la vitesse verticale en dehors de ce code, sauf pour la remetre a zero a quand je touche le sol si elle est > 0 donc rien a voir avec la chute.
Dans ma boucle de jeu, tout les conditions sont appeles en premier, puis viens la gravite, puis en dernier le mouvement.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme pour temporiser
« Réponse #1 le: Août 28, 2012, 10:37:16 pm »
C'est la vitesse qu'il faut multiplier par le temps écoulé, pour avoir une position. Or là c'est l'accélération (la gravité) que tu multiplies par le temps écoulé.
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Probleme pour temporiser
« Réponse #2 le: Août 29, 2012, 12:15:05 am »
merci :) donc c'est

Vitesse_verticale += FORCE_GRAVITE;

au lieu de

Vitesse_verticale += (FORCE_GRAVITE*ElapsedTime);  c'est ca que tu veux dire ? mais je garde le *ElapsedTime dans le move cela dit.

tu me diras, la meilleure facon de savoir c'est de le tester... ^^

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Probleme pour temporiser
« Réponse #3 le: Août 29, 2012, 01:11:53 am »
ca ne marche pas... mes deplacements droite gauche sont independants mais ma gravite toujours pas...
c'est bizarre quand meme. tu veux mon code complet ? jpeux te zipper et uploader le projet stuveux. Jten veux pas si tu dis non ^^ t'est l'admin j'ai remarque, tu dois etre blindé de taff ^^

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Probleme pour temporiser
« Réponse #4 le: Août 29, 2012, 05:03:06 am »
... jai essaye plein de combinaison possibles dans tout les sens... jarrive a rien.

le seul truc surprenant que jai remarque, c'est que si je ne temporise rien du tout en vitesse verticale, et bien le personnage saute exactement a la meme hauteur, mais met plus de temps a monter et a descendre si il y a moins d'images par secondes.

Il faudrait augmenter l'impulsion de saut et la gravite en fonction du nombre d'images par secondes pour eviter que le mouvement soit plus lent avec mois de fps.

jai vraiment aucune idee de comment faire desole ^^


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme pour temporiser
« Réponse #5 le: Août 29, 2012, 08:18:24 am »
Pardon, j'ai été un peu vite.

Il faut tout de même multiplier l'accélération par le carré du temps écoulé.

Vitesse_verticale += FORCE_GRAVITE * ElapsedTime * ElapsedTime;

J'ai la flemme de vérifier si ça colle bien avec la formule théorique, donc si ça ne marche toujours pas dis le moi, je regarderai plus en détail.
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Probleme pour temporiser
« Réponse #6 le: Août 29, 2012, 01:00:56 pm »
Mec, tu geres. Ca marche, yavais aussi l'impulsion de saut a multiplier par ElapsedTime et la vitesse verticale a ne pas multiplier avec ElapsedTime lors du move.
A titre informatif ducoup, le bon code etait :



#include "cl_personnage.hpp"


void Personnage::Sauter(float& ElapsedTime)
{
        if(Flag_contact_bas == true)
        {
                if(Flag_nage == false)
                        Vitesse_verticale = -(IMPULSION_SAUT * ElapsedTime);    // modif here ^^
                else
                        Vitesse_verticale = -((IMPULSION_SAUT/2) * ElapsedTime);    // modif here ^^
        }
}


void Personnage::Droite()
{
        if(Flag_nage == false)
                Vitesse_horizontale = VITESSE_PERSONNAGE;
        else
                Vitesse_horizontale = VITESSE_PERSO_NAGE;
}


void Personnage::Gauche()
{
        if(Flag_nage == false)
                Vitesse_horizontale = -VITESSE_PERSONNAGE;
        else
                Vitesse_horizontale = -VITESSE_PERSO_NAGE;
}


void Personnage::Gravite(float& ElapsedTime)
{
        // gravite "realiste"
        if((Flag_contact_bas == false) & (Vitesse_verticale <= Vitesse_max))
        {
                if(Flag_nage == false)
                        Vitesse_verticale += (FORCE_GRAVITE * ElapsedTime * ElapsedTime);    // modif here ^^
                else
                        Vitesse_verticale += ((FORCE_GRAVITE/2) * ElapsedTime * ElapsedTime);    // modif here ^^
        }

        // alternance de vitesse pour dissocier la gravite dans l'eau et dans l'air
        if(Flag_nage == true)
        {
                Flag_contact_bas = true;
                Vitesse_max = VITESSE_MAX_NAGE * ElapsedTime;    // modif here ^^

                if(Vitesse_verticale > Vitesse_max)
                        Vitesse_verticale = Vitesse_max;
        }
        else
                Vitesse_max = VITESSE_MAX * ElapsedTime;    // modif here ^^
}


void Personnage::Mouvement(float& ElapsedTime)
{
        Sprite_perso->Move(ElapsedTime * Vitesse_horizontale, Vitesse_verticale);    // modif here ^^
        Vitesse_horizontale = 0;
}
 


Encore merci gars tu peux pas realiser a quel point tu me sauve la vie, jy aurait vraiment pas pense tout seul
a cette histoire de carre !

nan peche que tout les trucs ou ya une modif sont necessaires. bien tire par les cheveux le delire mine de rien... ^^ et merci encore.
« Modifié: Août 29, 2012, 01:55:19 pm par Deu sex »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme pour temporiser
« Réponse #7 le: Août 29, 2012, 01:52:23 pm »
Pourquoi est-ce que tu multiplies la vitesse max par le temps écoulé ? C'est une vitesse constante, point. Tu dois multiplier par le temps uniquement lorsque tu veux obtenir le déplacement correspondant à un certain laps de temps à cette vitesse.
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Probleme pour temporiser
« Réponse #8 le: Août 29, 2012, 01:57:13 pm »
Pourtant le code comme tu le vois reagis bien. si je ne multiplie pas mes vitesses max, je suis fortement ralenti si jai moins d'images par secondes, dans l'eau par exemple.

Maj : avec le meme code, la gravite et la vitesse max fonctionnent bien, mais pas l'impulsion de saut, elle varie legerement j'ai l'impression. je vais voir ca.
« Modifié: Août 29, 2012, 02:02:15 pm par Deu sex »

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Probleme pour temporiser
« Réponse #9 le: Août 29, 2012, 02:12:02 pm »
l'impulsion de saut varie legerement avec beaucoup plus d'ips.

sur une plage de 30 FPS a 200 FPS par exemple, il n'y a pas de differences visibles.

Je pense que je vais me contenter de ca, je dois rendre mon travail dans 4 jours et il me reste encore pas mal de trucs a faire... Merci pour tout et a bientot :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme pour temporiser
« Réponse #10 le: Août 29, 2012, 02:39:31 pm »
Tu as supprimé le message dans lequel tu disais que la vitesse max ne marchait pas ?!
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Probleme pour temporiser
« Réponse #11 le: Août 29, 2012, 04:31:27 pm »
oui cetais avant de la multiplier par ElapsedTime

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme pour temporiser
« Réponse #12 le: Août 29, 2012, 04:42:03 pm »
Essaye d'éviter à l'avenir, ça rend la conversation complètement illisible.
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Probleme pour temporiser
« Réponse #13 le: Août 29, 2012, 04:58:27 pm »
ok desole :s a plus merci