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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    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

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 confirmé
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    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

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 confirmé
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    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

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 ?

+ 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