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

  1. #1
    Membre régulier 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
    Points : 76
    Points
    76
    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
    À toute erreur il y a une solution

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    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 : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    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 régulier 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
    Points : 76
    Points
    76
    Par défaut
    oui, je vais le mettre quand le jeu va être fini (au courant de la semaine environ)...
    À toute erreur il y a une solution

  5. #5
    Membre régulier 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
    Points : 76
    Points
    76
    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
    À toute erreur il y a une solution

  6. #6
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 601
    Points
    188 601
    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 !

  7. #7
    Membre régulier 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
    Points : 76
    Points
    76
    Par défaut
    ok j'en prend note je suis assez nouveau avec github... je vais aller voir ça tout de suite... EDIT:c'est fait

    pour les nombres aléatoires leur qualité ne me dérange pas dans le cas présent, mais tiendrai compte à l'avenir. Je ne savais juste pas où mettre cet objet donc je lui ai fait une en-tête avec son unique fonction statique... partant du principe de la responsabilité unique (http://blog.emmanueldeloget.com/inde...abilite-unique)
    À toute erreur il y a une solution

  8. #8
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 601
    Points
    188 601
    Par défaut
    Une classe (pas un objet) pour une seule méthode, statique qui plus est... Donc jamais d'instanciation, inutile de faire une classe, surtout que ça n'est rassemblé avec rien (au contraire des méthodes statiques de QString). Pourquoi pas une fonction libre ? Tu n'es pas en Java (sous-entendu : tu peux faire des trucs pas horribles ).
    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 !

  9. #9
    Membre régulier 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
    Points : 76
    Points
    76
    Par défaut
    oui je vais faire ça à la place...

    Mon problème c'est vraiment une question d'architecture comme tu l'as sûrement remarquer... connaitre un langage et savoir programmer c'est pas la même chose... sauf qu'il n'y a pas beaucoup de tutos qui montrent comment bien se structurer.

    Bref, je pense que je vais aller lire un tutoriel sur le GUI avec Qt où on fait un petit jeu, il me semble en avoir vu un dans la section des tutos. Peut-être que ça m'aidera un peu, parce que là je vois pas le bout du tunnel sincèrement.
    À toute erreur il y a une solution

  10. #10
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 601
    Points
    188 601
    Par défaut
    Citation Envoyé par Sytten Voir le message
    il me semble en avoir vu un dans la section des tutos.
    Fort probablement ça : http://qt.developpez.com/tutoriels/introduction-qt/.
    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 !

  11. #11
    Membre régulier 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
    Points : 76
    Points
    76
    Par défaut
    oui exactement celui-là...

    Parallèlement à Qt je veux suivre aussi un tuto de SFML et un tuto pour créer un jeu en c++ avec la SFML puisque je compte faire mon prochain jeu (si j'arrive à finir celui-là) en SFML.

    Je me doute bien que la meilleure façon de progresser question structure c'est de programmer, donc je vais donc tenter de programmer autant que je lis de tutos et essayer d'avoir une vie entre tout ça

    EDIT: J'ai presque trouvé la solution, j'ai encore modifié le code (commit sur github) il n'arrive juste pas à trouver mon signal, sinon le reste fonctionne.
    À toute erreur il y a une solution

  12. #12
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 601
    Points
    188 601
    Par défaut
    À revenir sur le sujet... Il me semble que tu ne sépares pas vraiment la logique de l'aspect graphique. Un des meilleurs exemples à ce sujet me semble être le code proposé par LittleWhite pour le dernier défi Qt : http://qt.developpez.com/defis/03-je...resultats/#LII. Bon, à ce niveau, c'est passablement exagéré, c'est extrêmement générique (plusieurs jeux de plateaux implémentables en très peu de code), mais c'est la bonne direction selon moi (d'autres diront d'autres choses, probablement, dans le genre « tant que ça fonctionne et que tu arrives à le maintenir sans problème, osef » ).
    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 !

  13. #13
    Membre régulier 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
    Points : 76
    Points
    76
    Par défaut
    je vais regarder ça... difficile pour moi de concevoir comment complètement séparer ces deux aspects.

    Les opinions sont en effet diverses... mais séparer l'aspect graphique de l'aspect logique est seulement une partie de mon problème non? ou c'est ce qui engendre tous les autres problèmes?

    Cordialement,
    Sytten
    À toute erreur il y a une solution

  14. #14
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 601
    Points
    188 601
    Par défaut
    En gros : la logique est ce qui est commun à toutes les interfaces (graphiques, en console, Web, etc.). Tout ce qui sera identique si tu utilises ton jeu en ligne de commande au niveau code sera ta logique (évidemment, j'oublie la partie logique dans l'interface, comme la gestion du glisser-déposer ou le rendu 3D pour un jeu récent, mais c'est une règle générale ).
    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 !

  15. #15
    Membre régulier 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
    Points : 76
    Points
    76
    Par défaut
    je comprend et je vais essayer d'appliquer cela (même si ça semble assez difficile)... je vais laisser ce projet de côté et me concentrer sur mon projet (jeu) d'école (je vais poster dans la section appropriée dans 1-2 semaines pour avoir des conseils le temps d'apprendre la SFML, le tile-mapping, le scrolling, etc.). Si je passe trop de temps sur ça je vais en manquer pour l'autre...

    En tout cas, un gros merci pour tout
    À toute erreur il y a une solution

+ 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