IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SFML Discussion :

[SFML] Ma fonction d'affichage bug


Sujet :

SFML

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut [SFML] Ma fonction d'affichage bug
    Salut ,
    je suis entrain de creer un jeu en SFML, mais voial je bloque a l'affichage des sprite.

    mais malheureusement cette fonction fait bugger mon programme ,
    buggé ça veut dire la fenetre reste gelé un peu, puis il y a le traditionnel message d'erreur qui apparait: envoyer, ne pas envyer...

    Voici plus d'infos:
    voila comment j'alloue de la memoir pour mes objets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Niveau::initObjet(Objet* obj, char c, int x, int y){
    //[...]
        obj = new Mur();//Mur erite de la classe objet
     
    }
    la partie censé afficher _tous les sprites_:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    typedef std::map < int, Objet*, std::less<int> > C_Objet;
     
    //c'est la fonction qui doit être appelé lorsqu'on veut un rafraichissement de l'écran
    void Moteur_graphique::affiche() {
        C_Objet objets = m_niveau.getTableauObjet();
        for(C_Objet::const_iterator itr = objets.begin(); itr != objets.end(); itr ++){
            itr->second->show(m_app);
            }
        bool Running = true;
         while (Running)
         {
             // Process events
             sf::Event Event;
             while (m_app.GetEvent(Event))
             {
                 // Close window : exit
                 if (Event.Type == sf::Event::Close)
                     Running = false;
             }
             // Update the window
             m_app.Display();
         }
    }
    et voici la fonction show de la classe objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Objet::show(sf::RenderWindow& app){
        app.Draw(sprite);
    }
    je ne sais pas trop d'ou vieznt le probleme . Pourriez vous m'aider?

    pour voir l'ensemble des sources, voici le lein:https://man-fan.svn.sourceforge.net/...n-fan/sources/
    merci de m'aider
    dommage

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Niveau::initObjet(Objet* obj, char c, int x, int y){
    //[...]
        obj = new Mur();//Mur erite de la classe objet
     
    }
    Si tu t'attends à ce que obj soit initialisé au retour de la fonction, c'est loupé, il faut le passer par référence si tu veux que ce soit le cas. Ou alors le faire renvoyer par ta fonction.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Si tu t'attends à ce que obj soit initialisé au retour de la fonction, c'est loupé, il faut le passer par référence si tu veux que ce soit le cas. Ou alors le faire renvoyer par ta fonction.
    Et pourquoi, le pointeur permet la meme chose, c'est l'adresse de mon objet qui est passé en parametre, et non pas une copie de ce dernier
    Sinon je ne sais pas (encore) allouer de la memoire par pasage de reference
    dommage

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et pourquoi, le pointeur permet la meme chose, c'est l'adresse de mon objet qui est passé en parametre, et non pas une copie de ce dernier
    Oui, donc ce serait bon si tu modifiais l'objet. Or là c'est le pointeur que tu modifies, et le pointeur lui est bien copié dans ta fonction puisque tu le passes par valeur.
    Si tu veux passer ton pointeur par référence ce n'est pas plus compliqué que pour n'importe quel autre type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Niveau::initObjet(Objet*& obj, char c, int x, int y){
    //[...]
        obj = new Mur();//Mur erite de la classe objet
     
    }
    Mais pourquoi ne pas le renvoyer, puisque c'est une création ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Objet* Niveau::initObjet(char c, int x, int y){
    //[...]
        return new Mur();//Mur erite de la classe objet
     
    }

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Oui, donc ce serait bon si tu modifiais l'objet. Or là c'est le pointeur que tu modifies, et le pointeur lui est bien copié dans ta fonction puisque tu le passes par valeur.
    Si tu veux passer ton pointeur par référence ce n'est pas plus compliqué que pour n'importe quel autre type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Niveau::initObjet(Objet*& obj, char c, int x, int y){
    //[...]
        obj = new Mur();//Mur erite de la classe objet
     
    }
    Mais pourquoi ne pas le renvoyer, puisque c'est une création ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Objet* Niveau::initObjet(char c, int x, int y){
    //[...]
        return new Mur();//Mur erite de la classe objet
     
    }
    ah oui, t'as raison, ça marche mnt.
    mais j'ai quand meme un probleme: l'image ne s'affiche pas, il y seulement un carrée blanc qui a les meme dimension que mes images qui s'affiche
    dommage

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu as vérifié que l'image était bien chargée ? Tu ne fais pas de copies de ton image après l'avoir affectée à ton sprite ?

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Tu as vérifié que l'image était bien chargée ? Tu ne fais pas de copies de ton image après l'avoir affectée à ton sprite ?
    ben ce que je ne comprends pas, c'est que si je charge mon image dans la fonction Objet::Show(), elle s'affiche.
    alors que si je le fait dans le constructeur, ça ne marche pas
    Je crois que ce code sera plus claire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //ce code ne marche pas:
    Objet::Objet(){
        sf::Image image;
        image.LoadFromFile("mur.png");
        sprite.SetImage(image);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //ce code marche:
    void Objet::show(sf::RenderWindow& app){
        sf::Image image;
        image.LoadFromFile("mur.png");
        sprite.SetImage(image);
        app.Draw(sprite);
    }
    dommage

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est normal, tu déclares ton image localement à ton constructeur, dès la sortie de celui-ci l'image sera détruite et le sprite pointera sur une variable qui n'existe plus. Il faut que ton image vive aussi longtemps que ton sprite en aura besoin.

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    C'est normal, tu déclares ton image localement à ton constructeur, dès la sortie de celui-ci l'image sera détruite et le sprite pointera sur une variable qui n'existe plus. Il faut que ton image vive aussi longtemps que ton sprite en aura besoin.
    Une derniere question: est ce que c'est toi qui a crée la SFML?
    si oui, ben elle vraiment super
    dommage

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Une derniere question: est ce que c'est toi qui a crée la SFML?
    Oui oui.

    si oui, ben elle vraiment super
    Merci, ça fait plaisir

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    SFML est une librairie naissante.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/07/2006, 22h58
  2. fonction d'affichage de code php en couleur
    Par winnie82 dans le forum Langage
    Réponses: 3
    Dernier message: 14/06/2006, 11h14
  3. trop de fonction dans draw(); -> bug ?
    Par Guillaume602 dans le forum OpenGL
    Réponses: 1
    Dernier message: 01/05/2006, 11h42
  4. une fonction d'affichage à rajouter
    Par isidore dans le forum C++
    Réponses: 17
    Dernier message: 27/02/2005, 17h03
  5. Fonction d'affichage
    Par Mynautor dans le forum OpenGL
    Réponses: 2
    Dernier message: 31/05/2004, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo