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 :

Gestions des différents écrans ou états d'un jeu

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut Gestions des différents écrans ou états d'un jeu
    Salut à vous !

    La taille du message ci-dessous peut faire peur à lire, mais je vous promet que le code est extrêmement basique et que le problème doit être simple à résoudre, seulement je n'ai pas trop su faire le tri entre ce qui est vraiment essentiel et ce qui l'est moins. D'avance merci pour votre temps

    Je ne suis pas totalement débutant avec Qt, et je connais le fonctionnement de base des widget, ainsi que la logique que suit Qt au niveau des évennements, signaux / slots etc. Je suis en train de réaliser un jeu de plateforme, en deux dimensions, avec une vue SFML pour le rendu, intégrée dans mon interface Qt. (J'ai pu lire que c'est souvent déconseillé, mais jusqu'ici je n'ai pas rencontré d'autres inconvénients, et j'ai besoin de tous les boutons / sliders / scrollArea et autres widgets que Qt me propose, en m'évitant d'avoir à les refaire en moins bien...)
    Mon problème est alors le suivant: si je veux séparer les différents écrans de mon jeu, par exemple: un écran titre, puis un écran menu, puis un écran ou se déroule le jeu lui-même, comment fais-je ?
    J'ai pensé à créer un nouveau widget personnalisé pour chaque écran, qui gère lui même les éléments qui le composent, par exemple:

    editorscreen.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
    #include "screenwidget.h"
    #include <QPushButton>
     
    class EditorScreen : public ScreenWidget
    {
    public:
        EditorScreen(QWidget *parent = 0);
        ~EditorScreen();
        void UpdateScreen();
     
    private:
        QPushButton* btn;
     
    };
    ScreenWidget (dont hérite EditorScreen) est une classe qui hérite de QWidget et qui sert de base à chaque écran-widget.

    screenwidget.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <QWidget>
     
    class ScreenWidget : public QWidget
    {
        Q_OBJECT
     
    public:
        ScreenWidget(QWidget *parent = 0);
        ~ScreenWidget();
        virtual void UpdateScreen();
    };
    Ensuite, dans ma fenêtre principale (j'ai créé une nouvelle classe Application dérivée de QWidget), je crée un pointeur vers ScreenWidget, qui pointera vers l'écran actuel.

    application.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
    #include <QWidget>
    #include <QTimer>
    #include "screenwidget.h"
    #include "editorscreen.h"
    #include "gamescreen.h"
    
    class Application : public QWidget
    {
        Q_OBJECT
    public:
        Application(QWidget *parent = 0);
        ~Application();
    
    public slots:
        void Loop();
    
    private:
        QTimer timer;
        ScreenWidget* state;
    };
    application.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
    #include "application.h"
    
    Application::Application(QWidget *parent) : QWidget(parent)
    {
        timer.setInterval(16);
        connect(&timer,SIGNAL(timeout()),this,SLOT(Loop()));
        timer.start();
    
        state = new EditorScreen(this);
    }
    
    Application::~Application()
    {
        delete state;
    }
    
    void Application::Loop()
    {
        state->UpdateScreen();
    }
    Avec ce code, j'obtiens ma fenêtre principale, qui m'affiche correctement le contenu de EditorScreen. Si je fais la même chose avec "state = new GameScreen(this);", j'obtiens bien mon écran de jeu et tout fonctionne à merveille. Problème: je ne parviens pas à passer d'un écran à l'autre au cours de l'éxecution ! J'ai essayé, depuis un slot Application::Switch(), déclenché par un signal ScreenWidget::TriggerSwitch(), émis grâce un clic sur un bouton dans EditorScreen, de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete state;
    state = new GameScreen(this);
    Mais j'obtiens une fenêtre vide, comme si la fenêtre principale restait mais que le GameScreen n'était pas créé !

    Je m'y prends aussi peut-être mal, il y a surement autre chose prévu pour ça, j'ai regardé du côté de QStateMachine mais ça ne semble pas très adapté et j'ai du mal à comprendre son fonctionnement...
    Enfin, j'attends vos suggestions avec impatiente !

  2. #2
    Futur Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut
    Je me suis souvenu qu'il existait un widget appellé QStackedWidget, qui me permet de n'afficher qu'un widget à la fois et qui pourrait résoudre mon problème. Mais ça signifie que tous les écrans sont créés et contenus en mémoire en même temps, or il se peut que mon écran de jeu contienne beaucoup d'informations (toute la map, composée de tiles, les personnages, etc.).
    J'avoue que je sèche totalement, j'aurais vraiment besoin d'un petit coup de main !

    Edit: Je m'en veux d'avoir fait une bourde aussi idiote, mais il suffisait simplement de faire un appel à sate->show();, et l'écran a bel et bien changé. Ce qui est étrange c'est que je n'ai pas besoin de le faire quand je le crée pour la première fois dans le constructeur de Application. Mon approche semble donc fonctionner pour le moment, mais le code sera difficile à maintenir et ça ne me semble pas très propre, alors si vous avez des idées pour l'améliorer dites le moi !

    Edit2: Après quelques tests, je n'arrive pas à comprendre pourquoi, mais je ne peux changer qu'une seule fois d'écran, après ça on dirait que le slot Application::SwitchScreen() n'est plus déclenché. De plus, lorsque je passe de l'écran de jeu à un écran vide (sans widget ni rien dessus), j'ai l'impression qu'en mémoire toutes les informations de jeu ne sont pas supprimées, ce qui est embêtant. Cette approche n'est décidément pas la bonne solution !

Discussions similaires

  1. Gestion des différents fichiers d'une classe
    Par esisarpi03 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/04/2012, 10h53
  2. Réponses: 8
    Dernier message: 24/08/2011, 11h23
  3. Réponses: 0
    Dernier message: 29/04/2010, 22h41
  4. Gestion des différentes versions avec VisualsourceSafe ?
    Par soso78 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 22/03/2009, 18h55
  5. Gestion des différentes sessions d'utilisateurs
    Par cjacquel dans le forum Flex
    Réponses: 1
    Dernier message: 27/01/2009, 09h20

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