Bonjour à tous.
Je viens ici car je rencontre des difficultés à corriger un bug dans le jeu que je code en ce moment.

Le principe du jeu est le suivant : les deux joueurs (représentés dans le code par des personnages) ont une certaine quantité de vie, énergie et magie qui sont modifiés quand l'un des joueur effectue une certaine action (se servir d'une arme enlèvera de l'énergie au joueur et de la vie à l'autre par exemple).

Mon problème est le suivant : quand j'appuie sur le QPushButton afin d'effectuer une action sur un autre joueur, la vie, énergie et magie des deux joueurs s'affichent bizarrement.
J'ai donc commencer à débugger le jeu à coup de qDebug() afin d'afficher de suivre l'évolution des variable de vie, énergie et magie d'un des joueurs.
Cependant cette évolution est assez bizarre. Voici le code de la fenêtre :
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
#ifndef _PAGECOMBATMULTILOCAL
#define _PAGECOMBATMULTILOCAL
 
#include "FenetrePrincipale.hpp"
#include "../Jeu/Gestion_personnages/Personnage.hpp"
 
class FenetrePrincipale;
 
class PageCombatMultiLocal : public QWidget
{
	Q_OBJECT
 
	public :
		PageCombatMultiLocal(FenetrePrincipale* fenetrePrincipale, Personnage& personnageJoueur1, Personnage& personnageJoueur2);
		void mettreAJourAttributs();
 
	public slots :
		void afficherPageMenuPrincipal();
		void executerActionChoisie();
 
	private :
		FenetrePrincipale *m_fenetrePrincipale;
 
		Personnage& m_personnageJoueur1;
		Personnage& m_personnageJoueur2;
 
		QLCDNumber* m_lcdAttributsJ1[3];
		QLCDNumber* m_lcdAttributsJ2[3];
		QProgressBar* m_barresAttributsJ1[3];
		QProgressBar* m_barresAttributsJ2[3];
		QPushButton* m_boutonsActionsJ1[6];
		QPushButton* m_boutonsActionsJ2[6];
		QTextEdit *m_zoneInformations;
};
 
#endif
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include "PageCombatMultiLocal.hpp"
#include <QtDebug>
 
PageCombatMultiLocal::PageCombatMultiLocal(FenetrePrincipale* fenetrePrincipale, Personnage& personnageJoueur1, Personnage& personnageJoueur2) :
	QWidget(fenetrePrincipale),
	m_fenetrePrincipale(fenetrePrincipale),
	m_personnageJoueur1(personnageJoueur1),
	m_personnageJoueur2(personnageJoueur2)
{
	// Layout attributs
	QLabel* labelsAttributs[3] = {new QLabel("<center>Vie</center>"), new QLabel("<center>Energie</center>"), new QLabel("<center>Magie</center>")};
	for (int i = 0; i < 3; i++)
	{
		m_lcdAttributsJ1[i] = new QLCDNumber(3);
		m_lcdAttributsJ2[i] = new QLCDNumber(3);
		m_barresAttributsJ1[i] = new QProgressBar;
		m_barresAttributsJ1[i]->setTextVisible(false);
		m_barresAttributsJ1[i]->setInvertedAppearance(true);
		m_barresAttributsJ2[i] = new QProgressBar;
		m_barresAttributsJ2[i]->setTextVisible(false);
	}
	m_barresAttributsJ1[0]->setObjectName("Vie");
	m_barresAttributsJ1[1]->setObjectName("Energie");
	m_barresAttributsJ1[2]->setObjectName("Magie");
	m_barresAttributsJ2[0]->setObjectName("Vie");
	m_barresAttributsJ2[1]->setObjectName("Energie");
	m_barresAttributsJ2[2]->setObjectName("Magie");
 
	QGridLayout *layoutAttributs = new QGridLayout;
	for (int i = 0; i < 3; i++)
	{
		layoutAttributs->addWidget(m_barresAttributsJ1[i], i, 0);
		layoutAttributs->addWidget(m_lcdAttributsJ1[i], i, 1);
		layoutAttributs->addWidget(labelsAttributs[i], i, 2);
		layoutAttributs->addWidget(m_lcdAttributsJ2[i], i, 3);
		layoutAttributs->addWidget(m_barresAttributsJ2[i], i, 4);
	}
 
 
	// Layout actions joueur 1
	for (int i = 0; i < 5; i++)
	{
		if (m_personnageJoueur1.actionCombat(i).texteAction() == "")
		{
			m_boutonsActionsJ1[i] = new QPushButton();
			m_boutonsActionsJ1[i]->hide();
		}
		else
			m_boutonsActionsJ1[i] = new QPushButton(m_personnageJoueur1.actionCombat(i).texteAction());
		m_boutonsActionsJ1[i]->setObjectName("Action");
	}
	m_boutonsActionsJ1[5] = new QPushButton("Utiliser un objet");
	m_boutonsActionsJ1[5]->setObjectName("UtiliserObjet");
 
	QVBoxLayout *layoutActionsJ1 = new QVBoxLayout;
	for (int i = 0; i < 5; i++)
		layoutActionsJ1->addWidget(m_boutonsActionsJ1[i]);
	layoutActionsJ1->addWidget(m_boutonsActionsJ1[5]);
 
	for (int i = 0; i < 5; i++)
		connect(m_boutonsActionsJ1[i], SIGNAL(clicked()), this, SLOT(executerActionChoisie()));
 
 
	// Layout actions joueur 2
	for (int i = 0; i < 5; i++)
	{
		if (m_personnageJoueur2.actionCombat(i).texteAction() == "")
		{
			m_boutonsActionsJ2[i] = new QPushButton();
			m_boutonsActionsJ2[i]->hide();
		}
		else
			m_boutonsActionsJ2[i] = new QPushButton(m_personnageJoueur2.actionCombat(i).texteAction());
		m_boutonsActionsJ2[i]->setObjectName("Action");
	}
	m_boutonsActionsJ2[5] = new QPushButton("Utiliser un objet");
	m_boutonsActionsJ2[5]->setObjectName("UtiliserObjet");
 
	QVBoxLayout *layoutActionsJ2 = new QVBoxLayout;
	for (int i = 0; i < 5; i++)
		layoutActionsJ2->addWidget(m_boutonsActionsJ2[i]);
	layoutActionsJ2->addWidget(m_boutonsActionsJ2[5]);
 
	for (int i = 0; i < 5; i++)
		connect(m_boutonsActionsJ2[i], SIGNAL(clicked()), this, SLOT(executerActionChoisie()));
 
 
	// Tableaux des sorts
	QStandardItemModel* tableauSorts[2] = {new QStandardItemModel(5, 3), new QStandardItemModel(5, 3)};
	QTableView* vueTableauSorts[2] = {new QTableView(), new QTableView()};
 
	for (int i = 0; i < 2; i++)
	{
		vueTableauSorts[i]->setEnabled(false);
		vueTableauSorts[i]->horizontalHeader()->hide();
		vueTableauSorts[i]->verticalHeader()->hide();
		vueTableauSorts[i]->setModel(tableauSorts[i]);
	}
 
 
	// Zone d'affichage des informations
	m_zoneInformations = new QTextEdit;
	m_zoneInformations->setEnabled(false);
 
 
	// Layout principal
	QPushButton* boutonsInformationJoueurs[2] = {new QPushButton("Joueur 1\n" + m_personnageJoueur1.nom() + " (niveau " + QString::number(m_personnageJoueur1.niveau()) + ")"), new QPushButton("Joueur 2\n" + m_personnageJoueur2.nom() + " (niveau " + QString::number(m_personnageJoueur2.niveau()) + ")")};
	for (int i = 0; i < 2; i++)
		boutonsInformationJoueurs[i]->setObjectName("InformationJoueur");
	QLabel *labelImage = new QLabel("<center>Version de démonstration de<br/>Unlimited Fight (v0.1)</center>");
	labelImage->setObjectName("Image");
	QPushButton *boutonQuitter = new QPushButton("Quitter");
 
	QGridLayout *layoutPrincipal = new QGridLayout;
	layoutPrincipal->addWidget(boutonsInformationJoueurs[0], 0, 0);
	layoutPrincipal->addLayout(layoutAttributs, 0, 1, 1, 4);
	layoutPrincipal->addWidget(boutonsInformationJoueurs[1], 0, 5);
	layoutPrincipal->addLayout(layoutActionsJ1, 1, 0, 1, 2, Qt::AlignVCenter);
	layoutPrincipal->addWidget(labelImage, 1, 2, 1, 2, Qt::AlignCenter);
	layoutPrincipal->addLayout(layoutActionsJ2, 1, 4, 1, 2, Qt::AlignVCenter);
	layoutPrincipal->addWidget(vueTableauSorts[0], 2, 0, 1, 2, Qt::AlignCenter);
	layoutPrincipal->addWidget(m_zoneInformations, 2, 2, 1, 2);
	layoutPrincipal->addWidget(vueTableauSorts[1], 2, 4, 1, 2, Qt::AlignCenter);
	layoutPrincipal->addWidget(boutonQuitter, 3, 2, 1, 2);
 
	connect(boutonQuitter, SIGNAL(clicked()), this, SLOT(afficherPageMenuPrincipal()));
 
	setLayout(layoutPrincipal);
 
	mettreAJourAttributs();
	fenetrePrincipale->ajouterPage(this, 1);
 
	qDebug() << m_personnageJoueur1.attribut(0) << "\n" << m_personnageJoueur1.attribut(1) << "\n" << m_personnageJoueur1.attribut(2);
}
 
void PageCombatMultiLocal::mettreAJourAttributs()
{
	for (int i = 0; i < 3; i++)
	{
		// mise à jour des afficheurs LCD
		m_lcdAttributsJ1[i]->display(m_personnageJoueur1.attribut(i));
		m_lcdAttributsJ2[i]->display(m_personnageJoueur2.attribut(i));
 
		// mise à jour des barres
		m_barresAttributsJ1[i]->setValue(qRound(m_personnageJoueur1.attribut(i) * 100 / m_personnageJoueur1.attributMax(i)));
		m_barresAttributsJ2[i]->setValue(qRound(m_personnageJoueur2.attribut(i) * 100 / m_personnageJoueur1.attributMax(i)));
	}
}
 
void PageCombatMultiLocal::afficherPageMenuPrincipal()
{
	m_fenetrePrincipale->afficherPage(0);
	delete this;
}
 
void PageCombatMultiLocal::executerActionChoisie()
{
	qDebug() << m_personnageJoueur1.attribut(0) << "\n" << m_personnageJoueur1.attribut(1) << "\n" << m_personnageJoueur1.attribut(2);
 
	int idPersonnage = 0;
	/*int idActionCombat;
 
	for (int i = 0; i < 5; i++)
	{
		if (m_boutonsActionsJ1[i]->isDown())
		{
			idPersonnage = 0;
			idActionCombat = i;
			break;
		}
 
		if (m_boutonsActionsJ2[i]->isDown())
		{
			idPersonnage = 1;
			idActionCombat = i;
			break;
		}
	}*/
 
	if (idPersonnage == 0)
		m_personnageJoueur1.effectuerAction(m_personnageJoueur2, 0);
	else
		m_personnageJoueur2.effectuerAction(m_personnageJoueur1, 0);
	mettreAJourAttributs();
}
Dans ce code j'ai laissé les qDebug. Il y en a aux lignes 133 et 158.
A la ligne 133 la variable de vie, d'énergie et de magie sont toutes les 3 à 100, ce que est normal, et à la ligne 158 ces variables ont des valeurs assez étranges comme 14730868 ou encore 212428728. Et généralement le programme cesse de fonctionner quand la fonction mettreAJourAttributs() est exécutée.

Ce qui est bizarre c'est que entre les lignes 133 et 158 il ne se passe normalement rien pour les variables de vie, énergie et magie.


C'est donc pour cela que j'ai besoin de votre aide.
Merci d'avance.