Forum de la communauté SFML

Aide => Système => Discussion démarrée par: nigelk le Avril 16, 2015, 02:01:06 pm

Titre: [Résolu] problème avec restart() de sf::Clock
Posté par: nigelk 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();
    }
}


Titre: Re : problème avec restart() de sf::Clock
Posté par: Laurent le Avril 16, 2015, 02:49:51 pm
http://en.sfml-dev.org/forums/index.php?topic=5559.msg36368#msg36368
Titre: Re : problème avec restart() de sf::Clock
Posté par: nigelk le Avril 16, 2015, 03:07:28 pm
C'est modifié, j'espère que c'est mieux.
Titre: Re : problème avec restart() de sf::Clock
Posté par: Laurent 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.
Titre: Re : problème avec restart() de sf::Clock
Posté par: nigelk le Avril 16, 2015, 04:09:01 pm
Ok :D j'espère que c'est bon maintenant  ;D
Titre: Re : problème avec restart() de sf::Clock
Posté par: Laurent 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.
Titre: Re : problème avec restart() de sf::Clock
Posté par: nigelk le Avril 16, 2015, 05:07:12 pm
Je vais essayer :)
Titre: Re : problème avec restart() de sf::Clock
Posté par: nigelk le Avril 16, 2015, 05:39:54 pm
Voilà je pense pas pouvoir faire plus court, ça compile mais m_timer ne restart pas.
Titre: Re : problème avec restart() de sf::Clock
Posté par: Laurent 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.
Titre: Re : problème avec restart() de sf::Clock
Posté par: nigelk 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 ?
Titre: Re : problème avec restart() de sf::Clock
Posté par: Laurent 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 ;)
Titre: Re : problème avec restart() de sf::Clock
Posté par: nigelk 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