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

Auteur Sujet: [Résolu] problème avec restart() de sf::Clock  (Lu 5257 fois)

0 Membres et 1 Invité sur ce sujet

nigelk

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
[Résolu] problème avec restart() de sf::Clock
« le: Avril 16, 2015, 02:01:06 pm »
Bonjour, j'ai un problème avec restart() qui ne fonctionne pas dans ce code et je ne comprends pas pourquoi, je cherche depuis un petit moment maintenant..
main.cpp:
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "animation.h"
#include "Lamp.h"
#include <iostream>

std::vector <Lamp*> Lamp::LampList;

int main(){
    Lamp *nouvelleLamp=new Lamp();
    while (true)
    {
            nouvelleLamp->getAnimation(0).play();
    }
    system("pause");
    return 0;
}
 
animation.h:
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>

#ifndef DEF_ANIMATION
#define DEF_ANIMATION
class Animation
{
private:
    sf::Clock m_timer;
    sf::Time m_tAnim;

public:
    Animation (sf::Time time);
    void play();


};
#endif
Lamp.h:
#ifndef LAMP_H
#define LAMP_H
#include "animation.h"

using namespace std;


class Lamp
{
    public:
        Lamp();
        static std::vector <Lamp*> LampList;
        Animation getAnimation(int i) { return m_animationList[i]; }
        void addAnimation (Animation &newAnimation) { m_animationList.push_back(newAnimation);}
        std::vector <Animation> m_animationList;
};

#endif // LAMP_H
 
Lamp.cpp:
#include "Lamp.h"

Lamp::Lamp()
{
    Animation*animTemp=new Animation(sf::milliseconds(600));
    this->addAnimation(*animTemp);
    Lamp::LampList.push_back(this);
}
 
animation.cpp:
#include "animation.h"
#include <iostream>
Animation::Animation(sf::Time tAnim)
{
    m_tAnim=tAnim;
}
void Animation::play()
{
    if (m_timer.getElapsedTime()>=m_tAnim)
    {
        std::cout << m_timer.getElapsedTime().asMilliseconds() << "  ";
        m_timer.restart();
    }
}


« Modifié: Avril 16, 2015, 09:22:49 pm par nigelk »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Laurent Gomila - SFML developer

nigelk

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #2 le: Avril 16, 2015, 03:07:28 pm »
C'est modifié, j'espère que c'est mieux.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #3 le: Avril 16, 2015, 03:46:31 pm »
Non. L'intérêt du code complet minimal c'est d'être complet et minimal... ;)
Regarde bien l'exemple qui est montré à la fin.
Laurent Gomila - SFML developer

nigelk

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #4 le: Avril 16, 2015, 04:09:01 pm »
Ok :D j'espère que c'est bon maintenant  ;D

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #5 le: Avril 16, 2015, 04:13:25 pm »
L'intérêt du code complet minimal c'est aussi de reproduire le problème... Là ton code ne compile même pas, ce qui signifie que tu ne l'as pas testé.

C'est pas pour t'embêter qu'on demande ça, c'est juste que c'est la manière la plus efficace de résoudre le problème. Donc mets-y un peu du tien, et tu verras que tu auras la solution très vite ;)

Et puis allège moi tout ça : pour debugger un problème de timer on n'a pas besoin d'une classe dédiée, ni même d'une fenêtre pour dessiner quoique ce soit. Ne retire pas juste du code au hasard, écris un nouveau code depuis zéro, avec en tête l'idée de reproduire le problème, et uniquement lui, dans un code qui ne fasse rien d'autre, de façon à mettre en avant le problème et pouvoir le debugger efficacement.
« Modifié: Avril 16, 2015, 04:16:29 pm par Laurent »
Laurent Gomila - SFML developer

nigelk

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #6 le: Avril 16, 2015, 05:07:12 pm »
Je vais essayer :)
« Modifié: Avril 16, 2015, 05:13:48 pm par nigelk »

nigelk

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #7 le: Avril 16, 2015, 05:39:54 pm »
Voilà je pense pas pouvoir faire plus court, ça compile mais m_timer ne restart pas.
« Modifié: Avril 16, 2015, 08:05:46 pm par nigelk »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #8 le: Avril 16, 2015, 08:07:30 pm »
Citer
Animation getAnimation(int i)
Tu renvoies par valeur, donc à chaque appel c'est une copie de l'animation qui est retournée. Donc en réalité tu ne modifies (restart) jamais l'animation stockée dans ton objet, uniquement des copies qui sont détruites immédiatement.

Et tu as aussi une fuite mémoire. Ainsi qu'un problème plus général de conception qui va t'embêter aussitôt que tu auras corrigé ta fonction getAnimation.
Laurent Gomila - SFML developer

nigelk

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #9 le: Avril 16, 2015, 08:14:30 pm »
Ok merci je me disais que ça devait être un problème de ce type mais j'arrivais pas à trouver.
Fuite mémoire à cause du new? parce que je compte utiliser des destructor..
Conception générale ? càd ?
« Modifié: Avril 16, 2015, 08:18:22 pm par nigelk »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #10 le: Avril 16, 2015, 09:05:26 pm »
Citer
Fuite mémoire à cause du new? parce que je compte utiliser des destructor..
Peu importe ce que tu comptes faire, là tu n'auras aucune chance de retrouver l'objet original pour le désallouer, puisque tu stockes une copie de celui-ci dans ton vector.

Citer
Conception générale ? càd ?
Ta façon de faire est mauvaise dès le départ, sans parler d'implémentation mais simplement d'organisation des classes. En gros, tu as des copies là où il ne devrait pas y en avoir. Je ne vais pas entrer trop dans le détail parce qu'il y en aurait pour des heures à expliquer convenablement tout ce qu'il faudrait. Typiquement ce genre de chose s'aquiert avec l'exprience et les erreurs ;)
Laurent Gomila - SFML developer

nigelk

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : problème avec restart() de sf::Clock
« Réponse #11 le: Avril 16, 2015, 09:16:40 pm »
Ok en tout cas merci beaucoup de m'avoir aidé, si c'est le genre de choses qu'on apprend avec l'expérience alors je comprends vu que j'en ai peu notamment en POO comme t'as du le deviner ;D