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
ScreenWidget (dont hérite EditorScreen) est une classe qui hérite de QWidget et qui sert de base à chaque écran-widget.
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.h
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.
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(); };
application.h
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 <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; };
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
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(); }
Mais j'obtiens une fenêtre vide, comme si la fenêtre principale restait mais que le GameScreen n'était pas créé !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 delete state; state = new GameScreen(this);
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 !![]()
Partager