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 :

Valeurs étranges suite à un clic sur QPushButton

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Par défaut Valeurs étranges suite à un clic sur QPushButton
    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.

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 214
    Par défaut
    Dans ce code j'ai laissé les qDebug. Il y en a aux lignes 133 et 158.
    ...
    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.
    Sans debugguer l'application, il faudra que tu revois ta façon de lire un programme : Entre la ligne 133 et 158, je vois la définition de deux nouvelles fonctions. Ton programme passera donc par ces lignes de codes seulement si ces fonctions sont appelées. Ton programme n'exécute pas un code de la première à la dernière ligne, mais saute de définition de fonction en définition de fonction, et cela même s'il doit changer de fichier !!!

    Et tes données, elles ne sont pas dans le fichier, mais dans une classe , donc tu as déjà à la base les fonctions membres de la classe à laquelle les données appartiennent qui peuvent modifier les données.

    Ensuite, tes données ne sont pas chacune dans un bunker, mais dans un espace mémoire sans pratiquement aucun mur (tu es en C++), et donc si une écriture déborde et veut écrire une variable qui se situe à côté des variables que tu regardes, mais se trompe d'adresse tu peux avoir des contenus de variables bizarre.


    Eh oui, c'est compliqué de deboguer

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Par défaut
    Citation Envoyé par Jérôme_C Voir le message
    Eh oui, c'est compliqué de deboguer
    C'est ce que je vois ^^

    En tout cas merci de m'avoir donné ces pistes.
    J'ai finalement trouvé d'où venait le problème. Je cherchais enfaite aux mauvais endroits. Mes deux objets Personnage attributs de la fenêtre sont des références. Et quand j'ai créé la fenêtre, j'ai passé des objets qui était détruits juste après. Si bien que quand j'utilisais mes objets personnages, il n'y avait plus rien en mémoire à ce moment là.

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

Discussions similaires

  1. [PPT-2007] Incrémenter la valeur d'une variable suite au clic sur une forme.
    Par BrItneY dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 07/09/2010, 14h48
  2. Réponses: 6
    Dernier message: 17/04/2009, 11h56
  3. Ajout dans une table suite à un clic sur un bouton
    Par karinette21 dans le forum IHM
    Réponses: 6
    Dernier message: 28/11/2008, 08h02
  4. Réponses: 3
    Dernier message: 23/10/2007, 13h35
  5. Récupération de données suite au clic sur Précédent
    Par benvienne dans le forum Langage
    Réponses: 5
    Dernier message: 10/03/2007, 14h36

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