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

Auteur Sujet: problème avec Clock  (Lu 3154 fois)

0 Membres et 1 Invité sur ce sujet

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
problème avec Clock
« le: Novembre 06, 2014, 08:07:01 pm »
Bonjour.

J'ai un soucis avec Clock: il ne s'écoule pas de la même manière a chaque boucle. Est-ce normale?

 
sf::Clock temps;                
    while (!controles.quitter()&&m_niveauOuvert == 1){
t1 = temps.getElapsedTime();
m_tip = 0;
if(t1.asMilliseconds()>50){
m_tip = 1;
tempsTest.restart();
}
 

Merci si vous pouvez m'aider

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec Clock
« Réponse #1 le: Novembre 06, 2014, 08:32:58 pm »
Citer
il ne s'écoule pas de la même manière a chaque boucle
Concrètement ça signifie quoi ? Qu'est-ce que tu constates ? A quoi t'attends-tu ? Quel est le problème ? Bref donne des détails...

Donne aussi des détails sur ton code, parce que là tu nous montres une boucle qui ne fait rien.
Laurent Gomila - SFML developer

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Re : problème avec Clock
« Réponse #2 le: Novembre 06, 2014, 10:00:19 pm »
Merci pour votre réponse. :)

Je m'attends a ce que, toutes les 50 millisecondes, précisément, je puisse faire avancer un objet, par exemple, ou déclencher une animation, quelque soit la vitesse de mon ordi (sauf, bien sur, si il n'arrive pas a faire les calcules entre-temps). Dans mon test, il s'agit de déplacer un objet sur le curseur de la souris (ou de le faire avancer de 1, le problème est toujours le même). Mon objet1 se déplace vite au début, et puis de plus en plus lentement. Je quitte le niveau, revien au menu, puis relance le niveau, et c'est encore plus lent de quelques secondes et ainsi de suite... Voici mon code:


sf::Clock tempsTest;                    //LANCE LE NIVEAU//
    while (!controles.quitter()&&m_niveauOuvert == 1){

t1 = tempsTest.getElapsedTime();

m_tip = 0;
if(t1.asMilliseconds()>50){
m_tip = 1; tempsTest.restart();}
    sf::Vector2i vecteurSouris = sf::Mouse::getPosition();

    if (m_tip == 1){
    objet1.recoiDeplacement(vecteurSouris.x,vecteurSouris.y);
    m_compteurTemps++;}

 

    m_afficheur->chargerPosition(objet1);
    m_afficheur->afficherNiveau();


        if (m_compteurTemps>100){
    m_compteurTemps = 0;
    m_niveauOuvert = 0;
    m_afficheur->libererNiveau(1);
    m_niveauSuivant = 0;}

   }

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec Clock
« Réponse #3 le: Novembre 06, 2014, 11:12:04 pm »
Tu pourrais au moins indenter ton code correctement, c'est illisible.
Laurent Gomila - SFML developer

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Re : problème avec Clock
« Réponse #4 le: Novembre 07, 2014, 08:29:35 am »
Voila. Est-ce mieux?

sf::Clock tempsTest;                    //LANCE LE NIVEAU 1//
    while (!controles.quitter()&&m_niveauOuvert == 1){
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
                //GESTION DU TEMPS//---------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////
t1 = tempsTest.getElapsedTime();
m_tip = 0;
///////////////////////////////////////////////////////////////////////////////////////////////////
    if(t1.asMilliseconds()>50)
        {
    m_tip = 1;
    tempsTest.restart();
        }
///////////////////////////////////////////////////////////////////////////////////////////////////
                //GESTION DES DEPLACEMENTS//-------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////
sf::Vector2i vecteurSouris = sf::Mouse::getPosition();
///////////////////////////////////////////////////////////////////////////////////////////////////
    if (m_tip == 1)//le decplacement opère toutes les 50 millisecondes
        {
    elementFeu.recoiDeplacement(vecteurSouris.x,vecteurSouris.y);
    m_compteurTemps++;
        }  
///////////////////////////////////////////////////////////////////////////////////////////////////
                //AFFICHE LE NIVEAU//--------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////
    m_afficheur->chargerPosition(elementFeu);
    m_afficheur->afficherNiveau();
    m_afficheur->recoiVue(m_reperX,m_reperY,0);
///////////////////////////////////////////////////////////////////////////////////////////////////
                //FERME LE NIVEAU//---------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////
        if (m_compteurTemps>100)//au bout de 5 secondes, le niveu se ferme
        {
    m_compteurTemps = 0;
    m_niveauOuvert = 0;
    m_afficheur->libererNiveau(1);
    m_niveauSuivant = 0;
        }
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
   }


merci
« Modifié: Novembre 07, 2014, 08:49:44 am par Laurent »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec Clock
« Réponse #5 le: Novembre 07, 2014, 08:50:17 am »
Franchement ? Non.
Laurent Gomila - SFML developer

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Re : problème avec Clock
« Réponse #6 le: Novembre 07, 2014, 09:23:29 am »
OK. Je reprend, avec la description de chaque ligne, si ca peut être plus clair...
Encore une fois, mon objectif est d'avoir une unité de mesure du temps précise de 50 millisecondes, pour avoir une gestion fluide du jeu en fonction du temps réel, et non celui de l'ordinateur, qui peut varier.

sf::Time t1;//je crée un temps t1.
sf::Clock temps;//Je met un chrono "temps"avant la boucle, comme dans le tuto     
           
    while (!controles.quitter()&&m_niveauOuvert == 1){//je lance ma boucle avec les conditions du niveau

m_tip = 0;          //Je reset m_tip a chaque début de boucle afin qu'il soit toujours à zéro sauf lorsque le temps
                           // écoulé est de 50millisecondes

t1 = tempsTest.getElapsedTime();//je prend le temps t1 au début de la boucle

    if(t1.asMilliseconds()>50)//si le temps t1 dépasse 50 millisecondes, m_tip = 1. (il sert ici d'unité pour le                     
                                             //temps du niveau
        {
    m_tip = 1;
    tempsTest.restart();         //je restart le temps pour qu'il reparte à zéro.
        }

sf::Vector2i vecteurSouris = sf::Mouse::getPosition(); //la je prend la position de la souris à chaque instant
                                                                                        //pour le déplacement du joueur

    if (m_tip == 1)//toutes les 50 millisecondes...
        {                 
    elementFeu.recoiDeplacement(vecteurSouris.x ,vecteurSouris.y); //mon objet recoi les déplacements
    m_compteurTemps++; //incrémente toutes les 50 milliseconde, pour gérer le temps global du niveau, qui               
                                          //est limité.
        }

    m_afficheur->chargerPosition(elementFeu);  //ici, j'envoi les positions à chaque frame, de l'objet
    m_afficheur->afficherNiveau();                      //a chaque frame, je demande au niveau de s'afficher.
    m_afficheur->recoiVue(m_reperX,m_reperY,0); //et d'envoyer la position de la vue.(qui bouge également)

        if (m_compteurTemps>100)//au bout de 100x50 millisecondes, le niveau se ferme
        {
    m_compteurTemps = 0; //Je reset le compteur du niveau au cas où
    m_niveauOuvert = 0;      //Je ferme le niveau
    m_afficheur->libererNiveau(1);  //Je demande la libération des surfaces
    m_niveauSuivant = 0;  //Pour l'instant, je revient au menu en mettant zéro.
        }

   }

Merci

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec Clock
« Réponse #7 le: Novembre 07, 2014, 01:45:22 pm »
Je parlais d'indentation, pas de commentaires. L'indentation c'est le nombre d'espaces / tabs en début de ligne, qui indique le niveau "hiérarchique" du bloc de code correspondant.

Et ce serait bien que tu utilises les balises de code dans tes posts.
Laurent Gomila - SFML developer

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Re : problème avec Clock
« Réponse #8 le: Novembre 07, 2014, 02:03:19 pm »
Ok. J'espère que cette fois ci ce sera mieu  :D

sf::Clock tempsTest;              
   
while (!controles.quitter()&&m_niveauOuvert == 1)
{
       t1 = tempsTest.getElapsedTime();
       
       m_tip = 0;

       if(t1.asMilliseconds()>500)
       {
              m_tip = 1;
              tempsTest.restart();
       }

       sf::Vector2i vecteurSouris = sf::Mouse::getPosition();

       if (m_tip == 1)//le decplacement opère toutes les 50 millisecondes
       {
              elementFeu.recoiDeplacement(vecteurSouris.x +m_reperX,vecteurSouris.y+m_reperY);
              m_compteurTemps++;
       }

       m_afficheur->chargerPosition(elementFeu);
       m_afficheur->afficherNiveau();
       m_afficheur->recoiVue(m_reperX,m_reperY,1600,900);

       if (m_compteurTemps>1000)//au bout de 5 secondes, le niveu se ferme
       {
              m_compteurTemps = 0;
              m_niveauOuvert = 0;
              m_afficheur->libererNiveau(1);
              m_niveauSuivant = 0;
       }
  }
 
« Modifié: Novembre 07, 2014, 03:25:07 pm par Laurent »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec Clock
« Réponse #9 le: Novembre 07, 2014, 03:29:40 pm »
Ca ne me paraît quand même pas compliqué à faire... Bon j'ai édité ton post pour indenter le code correctement, le but c'est pas non plus d'y passer la semaine ;)

Bon, au final ton code comporte de nombreuses variables et fonctions qu'on ne voit pas, donc difficile de t'aider. Mais globalement tu as deux façons de gérer correctement le temps :

1. La façon simple, approximative mais suffisante la plupart du temps : compte le temps écoulé entre chaque update (tour de boucle principale dans ton cas) et utilise ce delta de temps partout où cela a du sens. Par exemple, au lieu de déplacer l'entité d'un nombre fixe de pixels, utilise vitesse * temps.

2. La façon précise, utile notamment pour avoir des simulations ultra-précises et déterministes : il faut utiliser un timestep fixe, comme expliqué ici par exemple : http://gafferongames.com/game-physics/fix-your-timestep/
Laurent Gomila - SFML developer

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Re : problème avec Clock
« Réponse #10 le: Novembre 10, 2014, 02:35:17 pm »
Ok, merci.

Oui, j'ai fait une refonte de tout le système, et j'ai plus de problème de clock, ca semble marcher sans pb avec la 1er methode.

Merci  :)