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 :

Conseils sur l'architecture d'un jeu

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de Sytten
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 72
    Par défaut Conseils sur l'architecture d'un jeu
    Bonjour ,

    Pour clore mon apprentissage des bases de Qt, j'ai décidé de faire un petit jeu assez simple. Vous y avez sûrement déjà joué: vous avez les cartes, face cachée, devant vous et vous devez en retourner 2, si elles sont pareilles, vous avez gagné un point sinon vous les retournez et vous recommencez.

    J'ai déjà commencé à coder la base, mais je rencontre divers problèmes que je n'arrive vraiment pas à régler (je suis débutant avec Qt aussi et c'est mon premier jeu que je fais totalement tout seul...). Les * sont là pour dire que je n'arrive pas à faire complètement cette étape.

    Voici étape par étape comment fonctionne mon programme jusqu'à date:
    1. Le jeu ouvre une fenêtre de type FenPrincipale qui hérite de QMainWindow. Dans le constructeur, je crée la barre de menu et je fais setCentralWidget sur un Widget qui contient un QLabel et qui ouvre une image de démarrage (qui dit bienvenu dans CartesMatchs).
    2. Le joueur clique sur Partie, puis Nouvelle Partie dans la barre de menu. Cela appelle un slot perso qui commence la partie.
    *3. Dans le slot, je crée 36 instances de ma classe LabelImageJeu qui hérite de QLabel et dont j'ai réécrit la fonction mousePressEvent pour pouvoir retourner mes cartes quand le joueur clique dessus(je vais expliquer plus en détails plus bas). Je veux que ces objets soient contenu dans une QList ou un QVector, car j'aurai besoin de parcourir tous mes objets plus tard. Chaque objet reçoit un nombre aléatoire entre 1 et 18 (max deux fois chaque nombre) qu'il enregistre dans un int et qui correspond à la carte qui doit être retournée quand on clique sur l'objet. Les objets sont organisés dans un QGridLayout qui est contenu dans un QWidget qui devient mon centralWidget (cela implique que je vais faire des delete pour mon ancien centralWidget).
    *4. Le jeu commence et le joueur clique sur une image: la fonction mousePressEvent est appelée, on parcourt le QVector ou la QList pour voir si un des objets n'aurait pas déjà le bool retourné = true et le bool trouver = false (les deux sont initialisés à false). Si il y a 0 cas, alors on retourne la carte, on set bool retourne= true et on appelle la fonction setDerniereCarteRetourne de la FenPrincipale en lui envoyant un pointeur sur cette carte.
    *5. Le joueur clique sur une autre carte, il se passe la même chose, sauf que cette fois si on a une carte déjà retourné donc c'est un autre if: on retourne la carte, set le bool retourne = true, on compare le int carte (voir numéro 3) de cet objet avec celui de la carte retournée précédemment (d'où l'intérêt du pointeur).
    5.1. Si c'est pareil, on set les deux bool trouver = true et on vérifie voir si un tous les objets ont le bool trouver = true. Si oui, on appelle la fonction gagne de la FenPrincipale et on change le centralWidget pour une fenêtre où il est inscrit que vous avez gagné (donc delete des new fait dans le jeu). Sinon, on continue le jeu.
    5.2. Si c'est différent, on pause le programme pour 2-3 sec et on appelle ensuite la fonction retourneCarte des deux objets pour qu'ils redeviennent avec la face cachée.

    En gros c'est pas mal ça, à part des problèmes listés plus haut j'ai aussi ces problèmes: je n'arrive pas à faire que le background s'agrandit en même temps que la fenêtre (j'ai essayé une méthode, mais la fenêtre s'agrandissait toute seule sans aucun contrôle...) et je n'arrive pas à définir un background lorsque l'on joue...

    Ça fait pas mal de choses, mais j'ai vraiment besoin de votre aide, car je suis désespéré là

    Merci d'avance,
    Sytten

    mon FenPrincipale.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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    /**********Constructeur***********/
    FenPrincipale::FenPrincipale() : QMainWindow()
    {
        //Initialisation d'attributs
        m_derniereCarte = 0;
     
        //création de la fenetre de base
        QWidget* zoneCentraleBase = new QWidget;
            QVBoxLayout* layoutImageBase = new QVBoxLayout;
            QLabel* labelImageBase = new QLabel();
            labelImageBase->setPixmap(QPixmap(":/Images/start.jpg"));
            layoutImageBase->addWidget(labelImageBase);
            zoneCentraleBase->setLayout(layoutImageBase);
     
        /*zoneCentraleBase->setStyleSheet("background-image: url(:/Images/start.jpg);"
                                        "background-repeat: no-repeat;");*/
     
        //création des menus
        QMenu *menuPartie = menuBar()->addMenu("&Partie");
        QMenu *menuAide = menuBar()->addMenu("&?");
     
            //Menu Partie
            QAction *actionJouer = menuPartie->addAction("Nouvelle &partie");
                actionJouer->setShortcut(QKeySequence(Qt::Key_F2));
            menuPartie->addSeparator();
            QAction *actionOptions = menuPartie->addAction("&Options (à venir)");
                actionOptions->setShortcut(QKeySequence(Qt::Key_F4));
            QAction *actionStatistiques = menuPartie->addAction("&Statistiques (à venir)");
                actionStatistiques->setShortcut(QKeySequence(Qt::Key_F5));
            menuPartie->addSeparator();
            QAction *actionQuitter = menuPartie->addAction("&Quitter");
                actionQuitter->setShortcut(QKeySequence(Qt::Key_Escape));
     
            //Menu Help
            QAction *actionPropos = menuAide->addAction("À propos de CartesMatchs");
                actionPropos->setShortcut(QKeySequence(Qt::Key_F6));
     
     
        //connections
        connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
        connect(actionJouer, SIGNAL(triggered()), this, SLOT(nouvellePartie()));
     
     
     
        setCentralWidget(zoneCentraleBase);
    }
     
     
    /**********Lancement d'une nouvelle partie**********/
    void FenPrincipale::nouvellePartie()
    {   
        QList<int> nombres;
        srand ( time(NULL));
     
        for(int i = 1; i < 36; i++)
        {
            nombres << i << i;
        }
     
        for(int i = 0; i < 36; i++)
        {
            int nombreRandom = rand()% nombres.count();
            LabelImages image(nombres[nombreRandom]);
            nombres.removeAt(nombreRandom);
     
            listeImagesJeu.append(image);
        }
    }
     
     
    /**********Mettre en mémoire la dernière carte retournée**********/
    void FenPrincipale::setDerniereCarte(LabelImages* derniereCarte)
    {
        m_derniereCarte = derniereCarte;
    }

    Mon FenPrincipal.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
    #ifndef FENPRINCIPALE_H
    #define FENPRINCIPALE_H
     
    #include "LabelImageJeu.h"
    #include "time.h"
     
    class FenPrincipale : public QMainWindow
    {
        Q_OBJECT
     
        public:
            FenPrincipale();
            void setDerniereCarte(LabelImages* derniereCarte);
            LabelImages dernierCarte();
     
        public slots:
            void nouvellePartie();
     
        private:
            LabelImages* m_derniereCarte;
            QList<LabelImageJeu> listeImagesJeu;
    };
     
    #endif // FENPRINCIPALE_H
    mon LabelImageJeu.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
    #ifndef LABELIMAGEJEU_H
    #define LABELIMAGEJEU_H
     
    #include <QtGui>
     
    class LabelImageJeu : public QLabel
    {
        public:
            LabelImageJeu(int numeroImage);
            void mousePressEvent(QMouseEvent *event);
     
        private:
            bool m_trouver;
            bool m_voitFace;
            int m_numeroImage;
     
    };
     
    #endif // LABELIMAGEJEU_H

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 163
    Billets dans le blog
    153
    Par défaut
    Bonjour,

    Pour l'histoire du redimensionnement, il faut mettre le zoneCentraleBase dans un QLayout si je ne me trompe pas.
    Pour les autres problèmes, je ne suis pas sur d'avoir compris quel sont t-ils.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Beaucoup de points corrigé directement sur le chat

    @Sytten
    tu peux mettre le code final fonctionnel, pour ceux qui auraient un problème similaire ? Merci

  4. #4
    Membre actif Avatar de Sytten
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 72
    Par défaut
    oui, je vais le mettre quand le jeu va être fini (au courant de la semaine environ)...

  5. #5
    Membre actif Avatar de Sytten
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 72
    Par défaut
    Bon je dépoussière ce sujet car j'ai encore besoin d'un coup de main... sous les conseils gbdivers j'ai lu quelques articles sur la POO et j'ai essayer de réécrire mon jeu en séparant la logique de l'aspect graphique, mais je ne dois pas avoir fais cela correctement puisque que j'ai encore un problème d'inter-dépendance entre mes objets...

    Voici les codes:
    https://github.com/Sytten/CartesMatchs

    J'aimerais réellement améliorer ma structure de programmation avant de passer à un autre projet (plus gros), puisque si je ne suis pas capable de bien structure un petit jeu je n'ose pas imaginer ce que ça ferait avec un plus gros jeu...

    J'aimerais donc avoir votre avis sur ce code (deuxième de préférence) et une façon de l'améliorer (ou de le changer complètement...)

    Merci beaucoup,

    Sytten

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    Par défaut
    Déjà, première remarque : inutile de faire deux dépôts Git, un seul suffit mais avec des branches .

    Pourquoi faire un en-tête pour les nombres aléatoires ? Avec un peu de chance, tu viens de réduire fortement la qualité des nombres générés... Il y a pas mal de choses dans la bibliothèque standard C++ : http://www.cplusplus.com/reference/std/random/. (C'est quand même un poil délicat, ces affaires de nombres aléatoires... Enfin, si tu n'as que faire de leur qualité ou si celle fournie te suffit, c'est très bien !)

    Pas regradé plus.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

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

Discussions similaires

  1. Architecture et conseils sur la réalisation d'un jeu voxel
    Par MrTheoker dans le forum XNA/Monogame
    Réponses: 2
    Dernier message: 28/04/2014, 11h08
  2. Conseils sur l' "architecture" d'une vue
    Par Largo13 dans le forum Android
    Réponses: 0
    Dernier message: 22/10/2012, 13h50
  3. Conseils sur l'architecture à mettre en oeuvre pour projet d'application web
    Par Peppermay dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 30/03/2012, 18h14
  4. Réponses: 2
    Dernier message: 28/05/2011, 12h09
  5. Conseil sur l'architecture de mon projet
    Par Goffer dans le forum Flex
    Réponses: 2
    Dernier message: 17/07/2009, 11h27

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