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

Discussion :

Faire fonctionner QTimer

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant ingénieur informatique
    Inscrit en
    Décembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Etudiant ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Faire fonctionner QTimer
    Bonjour, je débute en Qt et voilà plusieurs jours que je bloque malgré mes nombreuses recherches. Je n'arrive simplement pas à utiliser QTimer
    J'aimerai que les ennemis sur la map puisse bouger mais le timer ne fonctionne pas.

    ennemi1 hérite de ennemi. Je met donc les 2 classes.

    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
    ennemi.h
     
    #ifndef ENNEMI_H
    #define ENNEMI_H
     
    #include "personnage.h"
    #include <QObject>
     
    class Ennemi : public QObject
    {
        public:
            Ennemi();
            void analyserDirection();
            void deplacer();
            void attaquer(Personnage personnage);
            void subirDegat(int attaque);
     
        private:
            int attaque;
            int defense;
            int vitesse;
            int vie;
            int direction;
    };
     
    #endif // ENNEMI_H

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ennemi.cpp
     
    #include "ennemi.h"
     
    Ennemi::Ennemi() : QObject()
    {
     
    }

    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
    ennemi1.h
     
    #ifndef ENNEMI1_H
    #define ENNEMI1_H
     
    #include "ennemi.h"
    #include <QPoint>
    #include <QLabel>
    #include <QPixmap>
    #include <QBitmap>
    #include <QTimer>
    #include <QMessageBox>
    #include <QApplication>
     
    class Ennemi1 : public Ennemi
    {
        Q_OBJECT
     
        public:
            Ennemi1(QPoint positionDepart, QWidget &fenetre);
     
        private:
            QLabel *label;
     
        public slots:
            void updateDeplacement();
    };
     
    #endif // ENNEMI1_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
    27
    28
    29
    30
    ennemi1.cpp
     
    #include "ennemi1.h"
    #include <iostream>
    #include <QDebug>
     
    Ennemi1::Ennemi1(QPoint positionDepart, QWidget &fenetre) : Ennemi()
    {
        QPixmap ennemi("../Graphisme/Ennemis/Ennemi1.png");
        QPixmap imgEnnemi = ennemi.copy(QRect(0, 96, 32, 48));
     
        label = new QLabel(&fenetre);
        label->setGeometry(positionDepart.x(), positionDepart.y(), 32, 48);
     
        QBitmap mask = imgEnnemi.createMaskFromColor(QColor(255, 255, 255));
        imgEnnemi.setMask (mask);
        label->setPixmap(imgEnnemi);
     
        // Déplacement
        QTimer *timer = new QTimer();
        connect( timer, SIGNAL(timeout()), this, SLOT(updateDeplacement()) );
        timer->start( 500 );
    }
     
    void Ennemi1::updateDeplacement()
    {
        qDebug() << "test";
        std::cout << "test";
        label->setGeometry(label->pos().x()+20, label->pos().y(), 32, 48);    
    }

    Je pourrais envoyer le projet au besoin mais il est brouillon.
    Merci de votre aide =)

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 897
    Points : 219 633
    Points
    219 633
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    Pour un jeu, je n'utiliserai pas un QTimer, mais une boucle de jeu, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (game)
        render()
        updateWorld()
    Pour le problème du QTimer, est ce que vous êtes sur que la connexion du slot/signal se fait (pas de message d'erreur dans la console).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pour un jeu, l'utilisation d'un QLabel déplacé dans un QWidget ne me semble pas particulièrement adaptée
    Je te conseillerais plutôt l'utilisation d'un QGraphicsPixmapItem dans un QGraphicScene.

    Remarque sur ton code : penser au destructeur virtuel dans la classe de base, et faire passer un QObject * au constructeur afin de bénéficier du mécanisme de Qt aidant à la libération "automatique" de la mémoire (voir le sujet Comment gérer la mémoire avec Qt ? de la FAQ).

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Etudiant ingénieur informatique
    Inscrit en
    Décembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Etudiant ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merci pour votre réponse. J'ai déjà développé un petit jeu assez complet et j'ai donc commencé à créer ce petit jeu de tower défense pour maîtriser qt. Il est donc plein de fautes et certainement mal organisé. Je prend note de ton message Winjerome et je prendrai le temps de mettre en application, pour le moment je me concentre pas trop sur l'optimisation, mais plutôt sur le fait que ça fonctionne ^^

    Pour un jeu, je n'utiliserai pas un QTimer, mais une boucle de jeu
    C'est vrai qu'en cours sur les sémaphores en java, j'ai vue qu'on pouvait initialiser un thread et faire une boucle infinie pour que le code s'exécute tout le temps. Ça peut être très intéressant dans mon cas en effet. Par contre comment faire du coup pour que ça s'exécute toutes les 20 ms et pas constamment ?

    Pour ce qui est du QTimer, je n'ai aucun affichage dans ma console alors que je devrais avoir "test" d'écrit. Si je met la ligne affichant "test" juste avant la connexion entre le signal et le slot, ça fonctionne et j'ai bien l'affichage. Je ne comprend pas pourquoi ça ne fonctionne pas. Au besoin j'ai hébergé mon projet (l'architecture est moche et vide).

    https://www.dropbox.com/s/516h9vfd74...%20Defense.rar

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 669
    Points : 10 674
    Points
    10 674
    Par défaut
    Citation Envoyé par pyrofox Voir le message
    C'est vrai qu'en cours sur les sémaphores en java, j'ai vue qu'on pouvait initialiser un thread et faire une boucle infinie pour que le code s'exécute tout le temps. Ça peut être très intéressant dans mon cas en effet. Par contre comment faire du coup pour que ça s'exécute toutes les 20 ms et pas constamment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        bool tmp = is_working;
     
        do {
            sleep(20); // usleep(20) ou autre
     
            render();
            updateWorld();
     
    //  Section critique
            tmp = is_working;
    //  Section critique
        } while (tmp);
    Édit: Tiens, j'aurais fait le Render en dernier

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Niveau1::Niveau1(QWidget &fenetre) : QWidget()
    {
        // Initialisation de la map
        Header header(fenetre);
        Map1 map(fenetre);
     
        // Ajout des ennemis
        QPoint positionDepart(0, 368);
        Ennemi1 ennemi1(positionDepart, fenetre);
     
    }
    Ici tous ces objets sont créés, mais immédiatement détruits en sortant du constructeur. Étend leur durée de vie en les mettant comme membres de la classe.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Etudiant ingénieur informatique
    Inscrit en
    Décembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Etudiant ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    J'ai essayer de les mettre comme membre de la classe Niveau1, je n'ai par contre pas de changement, le QTimer n'a toujours pas d'effet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Niveau1 : public QWidget
    {
        public:
            Niveau1(QWidget &fenetre);
            Ennemi1 ennemi1(QPoint positionDepart, QWidget &fenetre);
            Header header(QWidget &fenetre);
            Map1 map(QWidget &fenetre);
     
        private:
    };

  8. #8
    Invité
    Invité(e)
    Par défaut
    Là ce sont des méthodes que tu crées et non des attributs

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Etudiant ingénieur informatique
    Inscrit en
    Décembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Etudiant ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    C'est pas de la mauvaise volonté, mais j'arrive pas à le mettre en attribut sans messages d'erreurs ^^'

    niveau1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private:
            Ennemi1 ennemi1;
    niveau1.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ennemi1 = new Ennemi1(positionDepart, fenetre);

    C'est pas comme ça qu'on fait pour initialiser un attribut en lui donnant comme type le nom d'une classe ?
    Merci de ta patience

  10. #10
    Invité
    Invité(e)
    Par défaut
    Le contenu des messages d'erreur n'est pas fait pour décorer, et qu'on se dise juste mince j'ai une erreur ! Ils renseignent sur la nature exacte du problème. Prend donc bien soin de les "décortiquer".
    En complément, je ne te poserais qu'une question : de quel type est le retour de new Ennemi1(positionDepart, fenetre) ?

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Etudiant ingénieur informatique
    Inscrit en
    Décembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Etudiant ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Avant de poster un message je fais des tests et j'essaye de chercher par moi-même.
    new Ennemi1(positionDepart, fenetre) retourne un objet de type Ennemi1 que je stock dans ennemi1. J'ai donc déclarer l'attribut dans le .h en mettant Ennemi1 ennemi1. Ainsi, l'attribut ennemi1 est de type Ennemi1.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Non, new Objet retourne un pointeur sur Objet : Objet *
    Dernière modification par Invité ; 01/06/2014 à 06h06.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Etudiant ingénieur informatique
    Inscrit en
    Décembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Etudiant ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    En effet, en mettant Ennemi1* ennemi; tout fonctionne et le personnage se déplace.

    Merci beaucoup pour ton aide et pour avoir pris le temps de de répondre.

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

Discussions similaires

  1. impossible de faire fonctionner phppgadmin et pgdmin3
    Par le_ben dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 09/12/2004, 14h27
  2. Réponses: 5
    Dernier message: 02/09/2004, 19h53
  3. Faire fonctionner Flash sous Konqueror
    Par Ultra-FX dans le forum KDE
    Réponses: 2
    Dernier message: 20/06/2004, 18h40
  4. Réponses: 5
    Dernier message: 18/06/2004, 14h59
  5. comment faire fonctionner l'exe sur une autre machine
    Par brian79 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/05/2004, 14h00

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