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

Auteur Sujet: Difficulté de passage d'un paramètre à une méthode extérieure.  (Lu 1816 fois)

0 Membres et 1 Invité sur ce sujet

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Salut à tous,

Je bute sur un problème qui m'embête franchement depuis hier soir, alors voilà, j'ai une classe EventGestion qui contient une méthode ecouteSouris(RenderWindow &app)

Dans mon main, lorsque j'invoque cette méthode en lui passant la fenêtre de mon programme en argument, tout va bien mais... mon événement compris dans ma méthode ecouteSouris ( MD qui est donc une instance de ma classe MapDisplay que j'ai déclaré dans mon EventGestion.h ) semble ne pas prendre ce paramètre fenêtre en compte :

    void EventGestion::ecouteSouris(RenderWindow &app)
    {
        if (Mouse::isButtonPressed(Mouse::Left))
        {
            MD.ajouterBloc(app);
        }
    }

La méthode ajouterBloc(RenderWindow &app) de ma classe MapDisplay :

    void MapDisplay::ajouterBloc(RenderWindow &app)
    {
        position.x = Mouse::getPosition(app).x;
        position.y = Mouse::getPosition(app).y;
}

Lorsque je souhaite récupérer la position de ma souris avec des getters dans la boucle de mon Main, les coordonnées x et y restent à 0 comme si la fenêtre que j'ai tenté de passer en argument par l'intermédiaire de "ecouteSouris" n'était au final pas passée..

Merci [ Laurent ] & les autres de votre aide :-)
« Modifié: Décembre 31, 2016, 04:18:10 pm par Slash94 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Aïe aïe aïe.. J'ai du mal..
« Réponse #1 le: Décembre 31, 2016, 03:49:28 pm »
Salut

Premièrement, merci d'éditer ton titre pour le rendre pertinent. Les titres ne sont pas juste là pour faire joli, ils servent à aiguiller les gens, à leur indiquer de quoi il est question sans avoir à lire tout le message.

Citer
comme si la fenêtre que j'ai tenté de passer en argument par l'intermédiaire de "ecouteSouris" n'était au final pas passée
Ca ça ne veut rien dire. Ce n'est pas comme si tu ne passais pas de fenêtre, puisque tu en passes une. Et si tu n'en passais pas tu aurais des coordonnées relatives à l'écran, pas 0 ;)

Au lieu d'essayer de lancer des idées aléatoirement, je préfère te dire quoi faire pour résoudre ce problème (et les suivants) :
- utilise ton debugger (pourquoi est-ce que les gens le font jamais ?!!), pour surveiller les valeurs de variables, fais une exécution pas à pas pour voir à quel moment ça déconne, etc.
- au pire, si le debugger te fais vraiment peur, affiche plein d'informations intermédiaires avec des std::cout, toujours dans le même but : voir à quel moment tu n'as pas ce que tu devrais avoir.
- ne te focalise pas sur ce que tu penses être la source du problème, bien souvent la cause est toute autre, donc vérifié bien tout.

En tout cas le problème n'est pas dans les quelques lignes de code que tu montres.
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Difficulté de passage d'un paramètre à une méthode extérieure.
« Réponse #2 le: Décembre 31, 2016, 04:23:24 pm »
Merci Laurent,

Effectivement, je ne me suis jamais réellement familiarisé avec le debugger, je me suis toujours contenté de corriger les erreurs une à une en fonction des erreurs du compilo..

Je crains de te faire piquer tes beaux yeux, Laurent, mais je vais poster ici l'intégralité de ma source :

main.cpp

#include <iostream>
#include <SFML/Graphics.hpp>

#include "MapDisplay.h"
#include "EventGestion.h"

using namespace std;
using namespace sf;

int main()
{
    int WIDTH = 800, HEIGHT = 600;

    RenderWindow app(VideoMode(WIDTH, HEIGHT, 32),"SFML Editeur de Maps", Style::Titlebar);
    app.setFramerateLimit(60);

    Clock clock;

    MapDisplay MD(50,16,12);
    EventGestion EG(MD);

    while (app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            if (event.type == event.Closed || Keyboard::isKeyPressed(Keyboard::Escape))
                app.close();
        }

        app.clear();

        EG.ecouteClavier(app);
        EG.ecouteSouris(app);

        MD.afficherMapConsole();
        system("cls");

        cout << " cube size : " << MD.getCubeSize() << endl;
        cout << " Position souris x : " << MD.mouseX() << endl;
        cout << " Position souris y : " << MD.mouseY() << endl;

        if (MD.getCubeSize()>0)
        {
            MD.afficherMapWindow(app);
        }

        app.display();
    }

}
 

EventGestion.cpp

#include <SFML/Graphics.hpp>

#include "EventGestion.h"

#include <iostream>

using namespace std;
using namespace sf;

    EventGestion::EventGestion(MapDisplay Map) :
        MD(Map)
    {

    }

    void EventGestion::ecouteClavier(RenderWindow &app)
    {

    }

    void EventGestion::ecouteSouris(RenderWindow &app)
    {
        if (Mouse::isButtonPressed(Mouse::Left))
        {
            MD.ajouterBloc(app);
        }
    }
 

MapDisplay.cpp

#include <SFML/Graphics.hpp>

#include "MapDisplay.h"

#include <iostream>

using namespace std;
using namespace sf;

    MapDisplay::MapDisplay(int blocSize, int xMap, int yMap) :
        m_blocSize(blocSize), m_xMap(xMap), m_yMap(yMap)
    {
        mapArea[m_xMap][m_yMap];

        for (int y = 0 ; y < m_yMap ; y++)
        {
            for (int x = 0 ; x < m_xMap ; x++)
            {
                mapArea[y][x] = 0;
            }
        }
    }

    void MapDisplay::afficherMapConsole()
    {
        for (int y = 0 ; y < m_yMap ; y++)
        {
            for (int x = 0 ; x < m_xMap ; x++)
            {
                cout << mapArea[y][x];
            }
            cout << endl;
        }
    }

    void MapDisplay::ajouterBloc(RenderWindow &app)
    {
        position.x = Mouse::getPosition(app).x;
        position.y = Mouse::getPosition(app).y;

            for (int i = 0 ; i < m_yMap ; i++)
            {
                for (int c = 0 ; c < m_xMap ; c++)
                {
                    if ( i*50 == (position.y/m_blocSize)*m_blocSize
                        && c*50 == (position.x/m_blocSize*m_blocSize))
                        {
                            RectangleShape *b = new RectangleShape(Vector2f(50,50));
                            b->setPosition(Vector2f(c*50, i*50));
                            Cube.push_back(*b);
                        }
                }
            }
    }

    void MapDisplay::afficherMapWindow(RenderWindow &app)
    {
        for ( int i = 0 ; i < Cube.size() ; i++ )
        {
            app.draw(Cube[i]);
        }
    }

    int MapDisplay::getCubeSize() { return Cube.size(); }
    int MapDisplay::mouseX() { return position.x; }
    int MapDisplay::mouseY() { return position.y; }
 

Voilà, j'ai posté mes 3 fichiers CPP, je vous épargne les fichiers headers qui ne sont que de simples prototypes ainsi que les déclarations de mes variables utilisées dans mes méthodes.

Merci encore !!
« Modifié: Décembre 31, 2016, 04:25:25 pm par Slash94 »

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Difficulté de passage d'un paramètre à une méthode extérieure.
« Réponse #3 le: Décembre 31, 2016, 05:01:31 pm »
Génial ! J'ai trouvé !!!!

Suffisait simplement de passer en référence mon objet MapDisplay avec & !

Que suis-je c*n des fois...  ;D

Une fois de plus, si ma c**nerie peut en aider d'autres..  ::)