C ++ Affectation des valeurs de condition booléennes dans si l’instruction ne fonctionne pas?

J’ai codé un jeu en C ++ en utilisant la bibliothèque SDL. Aujourd’hui, alors que je change la façon dont fonctionne la classe de mon personnage, je me heurte à un problème très déroutant. Le code suivant fait partie de ma logique permettant au joueur de tirer des balles. Les variables de contrôle, b_canFire et b_shouldFire (je prévois de les renommer), sont définies ailleurs dans la classe pour permettre à cette fonction de s’exécuter lorsque l’utilisateur appuie sur une touche.

bool PlayerChar::DoFiring() { if(b_canFire && b_shouldFire) { Fire(box.x + 22, box.y); // This fires a bullet b_canFire = false; // Does not work b_shouldFire = false; // Does not work return true; } } 

Lorsque je parcoure ce code en utilisant mon débogueur, il devient évident que les valeurs de b_canFire et de b_shouldFire ne sont pas remplacées par les affectations dans l’instruction if. Cependant, si je modifie le code comme suit:

 bool PlayerChar::DoFiring() { if((b_canFire) && (b_shouldFire)) { Fire(box.x + 22, box.y); // This fires a bullet b_canFire = false; // Works b_shouldFire = false; // Works return true; } } 

ou

 bool PlayerChar::DoFiring() { if(b_canFire == true && b_shouldFire == true) { Fire(box.x + 22, box.y); // This fires a bullet b_canFire = false; // Works b_shouldFire = false; // Works return true; } } 

Soudain, les devoirs fonctionnent. J’ai également essayé de reproduire cette situation dans un projet-test vide, comme suit:

 bool bC = true; bool bD = true; if(bC == true && bD == true) { bC = false; // Works bD = false; // Works } bool bE = true; bool bF = true; if(bE && bF) { bE = false; // Works bF = false; // Works } 

Cependant, ces deux exemples atsortingbuent les valeurs exactement comme ils le devraient. Clairement, il me manque quelque chose ici, mais pour la vie de moi, je ne peux pas voir ce que c’est. J’ai trouvé comment résoudre le problème pour faire fonctionner mon code, mais cela me dérange vraiment de ne pas savoir ce qui brise les devoirs dans le premier exemple, car tout ce que j’ai appris sur C ++ jusqu’à présent me dit qu’ils devraient fonctionner correctement.

Ceci est mon premier projet majeur utilisant le langage C ++, et je suis toujours en train d’apprendre, donc toute aide ou conseil de programmeurs plus expérimentés serait génial.

Merci!

MODIFIER:

Comme demandé ici est la classe entière:

 #include  #include "SDL_mixer.h" #include "hiGlobalVars.h" #include "hiGlobalObjects.h" #include "hiAssetManager.h" #include "hiRendering.h" #include "hiTimer.h" #include "hiBullet.h" #include "hiPlayerChar.h" #include "hiDebugger.h" using std::list; PlayerChar::PlayerChar() { moveSpeed = 6; moveDir = NONE; b_canFire = true; b_shouldFire = false; box.x = 0; box.y = 470; box.w = 38; box.h = 40; } PlayerChar::~PlayerChar() { } void PlayerChar::SetPos(int x) { box.x = x; } void PlayerChar::Draw() { BlitSurface(box.x, box.y, assets.ss_playerchar_idle, ss_screen); } bool PlayerChar::DoFiring() { if((b_canFire) && (b_shouldFire)) { // Fire a bullet Fire(box.x + 22, box.y); b_canFire = false; b_shouldFire = false; return true; // fired a bullet } return false; // did not fire a bullet } void PlayerChar::Fire(int x, int y) { // Create a new bullet at the correct location and add it to the global bullet list Bullet* bullet = new Bullet(); bullet->SetPos(x, y); bullets.push_back(bullet); // Play bullet firing sound Mix_PlayChannel(-1, assets.mc_firebullet, 0); } void PlayerChar::HandleInput(Uint8* keystates) { if(keystates[SDLK_LEFT] && keystates[SDLK_RIGHT])// Both direction keys moveDir = NONE; if(keystates[SDLK_LEFT] && !keystates[SDLK_RIGHT]) // Left key and not right key moveDir = LEFT; if(!keystates[SDLK_LEFT] && keystates[SDLK_RIGHT]) // Right key and not left key moveDir = RIGHT; if(!keystates[SDLK_LEFT] && !keystates[SDLK_RIGHT]) // Neither direction key moveDir = NONE; if(keystates[SDLK_SPACE]) // Space bar b_shouldFire = true; if(!keystates[SDLK_SPACE]) // Allow another bullet to be fired after release b_canFire = true; } void PlayerChar::Move() { if(moveDir == LEFT && box.x > 0) // If not off screen, move box.x -= moveSpeed; if(moveDir == RIGHT && box.x w - box.w)) box.x += moveSpeed; } 

et l’en-tête:

 #ifndef __hiPlayerChar__ #define __hiPlayerChar__ #include "SDL.h" #include "SDL_mixer.h" #include "hiGlobalVars.h" enum MoveDir { LEFT, RIGHT, NONE }; class PlayerChar { private: Sint16 moveSpeed; MoveDir moveDir; bool b_canFire; bool b_shouldFire; public: // Ctr & Dtr PlayerChar(); ~PlayerChar(); // Functions void SetPos(int x); bool DoFiring(); void Fire(int x, int y); void Move(); void Draw(); void HandleInput(Uint8* keystates); // Size and position SDL_Rect box; }; #endif 

Il manque la dernière instruction de retour dans votre fonction:

 bool PlayerChar::DoFiring() { if(b_canFire && b_shouldFire) { Fire(box.x + 22, box.y); // This fires a bullet b_canFire = false; // Does not work b_shouldFire = false; // Does not work return true; } return false; // WAS MISSING HERE } 

Ensuite, votre fonction retourne quelque chose (UB) si l’un de vos b_canFire, b_shouldFire est faux.