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

Qt Discussion :

Problème setPixmap et algo ?


Sujet :

Qt

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Par défaut Problème setPixmap et algo ?
    Bonjour,

    Mon programme a l'air correct au premier abord.
    Ce que je cherche à faire ?

    Déplacer un pacman avec les touches directionnelles du clavier (up, down, left et right).
    Le Down et Right fonctionne bien, mais pas le Up et Left.
    Je pense que ça vient de la soustration ...
    Ce qui est bizarre, c'est quand changeant :
    setPosY(getPosY()-10);
    par
    setPosY(getPosY()+10); pour Up
    ça fonctionne, mais ça se déplace d'un plus grand saut que Down ... pourtant mes accesseurs n'ont pas l'air faux.


    Puis 2ème soucis, je souhaiterai changer l'image lorsque j'appuie sur les touches pour que le pacman soit orienté, mais l'image ne se change pas ...

    Voici mes sources :

    main.cpp
    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
    #include <QApplication>
    #include <QPushButton>
    #include "Fenetre.h"
     
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        //
        Fenetre fenetre;
     
     
        QObject::connect(&fenetre, SIGNAL(pressed(QKeyEvent)), &fenetre, SLOT(keyPressEvent(QKeyEvent)));
        // Affichage de la fenêtre
        fenetre.show();
     
        return app.exec();
    }
    Fenetre.h
    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
    24
    25
    26
    #ifndef DEF_MAFENETRE
    #define DEF_MAFENETRE
     
    #include <QApplication>
    #include <QWidget>
    #include <QLabel>
    #include <QKeyEvent>
     
     
    class Fenetre : public QWidget // On hérite de QWidget (IMPORTANT)
    {
        public:
        Fenetre();
        void keyPressEvent(QKeyEvent *event);
        void setPosX(int x);
        void setPosY(int y);
        int getPosX();
        int getPosY();
     
        private:
        QLabel *pacman;
        int posX;
        int posY;
    };
     
    #endif

    Fenetre.cpp
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include "Fenetre.h"
     
    Fenetre::Fenetre() : QWidget()
    {
        setFixedSize(800, 600);
        setStyleSheet("background-color: rgb(0,0,0)");
     
        posX = 30;
        posY = 30;
        pacman = new QLabel(this);
        pacman->setPixmap(QPixmap("res/bitmap6.bmp"));
        pacman->move(posX, posY);
     
    }
     
    void Fenetre::keyPressEvent(QKeyEvent *event)
    {
     
        switch(event->key())
        {
            case Qt::Key_Up :
                setPosY(getPosY()-10);
                pacman->setPixmap(QPixmap("res/bitmap1.bmp"));
                pacman->move(getPosX(),getPosY());
     
            case Qt::Key_Down :
                setPosY(getPosY()+10);
                pacman->setPixmap(QPixmap("res/bitmap4.bmp"));
                pacman->move(getPosX(),getPosY());
     
            case Qt::Key_Left :
                setPosX(getPosX()-10);
                pacman->setPixmap(QPixmap("res/bitmap8.bmp"));
                pacman->move(getPosX(),getPosY());
     
            case Qt::Key_Right :
                setPosX(getPosX()+10);
                pacman->setPixmap(QPixmap("res/bitmap6.bmp"));
                pacman->move(getPosX(),getPosY());
        }
     
    }
     
    void Fenetre::setPosX(int x)
    {
        posX = x;
    }
     
    void Fenetre::setPosY(int y)
    {
        posY = y;
    }
     
    int Fenetre::getPosX()
    {
        return posX;
    }
     
    int Fenetre::getPosY()
    {
        return posY;
    }

    Sauriez-vous comment je pourrais régler ce(s) problème(s) ?
    Je n'attends pas une correction, mais au moins si on pouvait me mettre sur la piste ...

    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(&fenetre, SIGNAL(pressed(QKeyEvent)), &fenetre, SLOT(keyPressEvent(QKeyEvent)));
    Les évènements sont appelés indépendamment des signaux et des slots : tu n'as pas besoin de gérer leur appel.
    D'autant plus que le signal pressed() n'est pas un signal de QWidget.
    Pour faire un mini-jeux comme celui-ci, je serais plutôt passé par QGraphicsScene.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Par défaut
    oui l'utilisation de QGraphicsView / QGraphicsScene est plus appropriée et surement plus optimisée dans ton cas.

    Et pour orienté ton pacman un flip ou rotate suffirait (plutot que de charger une image différente)

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    +1 pour le QGraphics
    et -10 pour l'oublie des break dans le switch case

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Par défaut
    Exact, j'ai oublié de revenir sur le topic pour le dire mais j'avais effectivement oublié les break; dans mon switch maintenant tout fonctionne bien !

    Sinon je ne comprends pas en quoi cette ligne n'est pas correct, bien que ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(&fenetre, SIGNAL(pressed(QKeyEvent)), &fenetre, SLOT(keyPressEvent(QKeyEvent)));
    J'essaierai de me pencher sur QGraphics dès que possible.

    Merci

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Par contre, si c'est pour un jeux, cette solutin n'est pas optimale. En principe, il faut utiliser un timer et regarder l'etat des bouttons.
    Pour le boutton type crtl, shift,... Qt fournie la fonction http://qt.developpez.com/doc/latest/...boardModifiers
    Pour les autres, y as rien par défaut, il faudra le faire toi même.
    Normalement, si tu fait une recherche, y as une discution ou je montre un example où je sauvegarde l'état des touches en utilisant un eventFilter sur QApplication.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Citation Envoyé par shaoling Voir le message
    Exact, j'ai oublié de revenir sur le topic pour le dire mais j'avais effectivement oublié les break; dans mon switch maintenant tout fonctionne bien !

    Sinon je ne comprends pas en quoi cette ligne n'est pas correct, bien que ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(&fenetre, SIGNAL(pressed(QKeyEvent)), &fenetre, SLOT(keyPressEvent(QKeyEvent)));
    J'essaierai de me pencher sur QGraphics dès que possible.

    Merci
    Salut,

    Tout d'abord, comme il a été dit plus haut parce que le signal que tu utilises n'existe pas, je ne sais pas ce que tu utilises pour exécuter ton code mais si t'es en debug tu dois avoir une erreur du genre "connect: no such signal QWidget::pressed(QKeyEvent) in main.cpp:<line_number>" à l'exécution. Si tu n'as pas de sortie debug et que tu es sous Windows tu peux utiliser DebugView (par défaut il capte tous les messages donc c'est un peu fouilli mais tu peux mettre des filtres). Bref cette ligne est ignorée dans tous les cas.

    Et pourquoi ça marche? Parce que c'est comme ça que marche keyPressEvent (voir la doc de QWidget: "keyPressEvent() is called whenever a key is pressed, and again when a key has been held down long enough for it to auto-repeat."). Et il en est de même pour tous les xxxEvent(), par exemple keyReleaseEvent, mousePressEvent, mouseReleaseEvent, ..., pas besoin de faire de connect pour que ça marche.

    G.

    PS: passe au plus vite à une QGraphicsView car il me semble qu'en plus tu as une détection de collision implémentée dans la QGraphicsScene (voir example ici: http://qt.developpez.com/doc/latest/...idingmice.html).

Discussions similaires

  1. Problème de compréhension algo
    Par Geekaple dans le forum Débuter
    Réponses: 31
    Dernier message: 06/01/2012, 17h58
  2. probléme avec mon algo
    Par lucastof dans le forum MATLAB
    Réponses: 7
    Dernier message: 28/03/2011, 20h13
  3. Problème avec un algo (Connexité)
    Par Mike888 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/05/2007, 11h45
  4. Problème sur un algo en C++
    Par Masternono dans le forum C++
    Réponses: 7
    Dernier message: 19/02/2006, 19h05
  5. Problême avec les algos, itérateurs ...
    Par R'SKaP dans le forum C++
    Réponses: 14
    Dernier message: 18/12/2005, 23h14

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