我一直在用C ++编写一个使用SDL库的游戏。 今天,在改变玩家angular色职业的方式的同时,我也遇到了一个非常令人困惑的问题。 下面的代码构成了我的逻辑允许玩家发射子弹的一部分。 控制variablesb_canFire和b_shouldFire(我计划重新命名这些variables以使其更有意义)在类中的其他位置设置,以允许在用户按下某个键时执行此function。
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; } }
当我使用我的debugging器遍历这段代码时,b_canFire和b_shouldFire的值不会被if语句中的赋值变为false。 但是,如果我将代码更改为以下内容:
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; } }
要么
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; } }
突然之间的任务工作。 我也尝试在一个空的testing项目中复制这种情况,如下所示:
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 }
但是,这两个示例都完全按照它们的值来分配值。 显然我在这里失去了一些东西,但是对于我的生活,我看不到它是什么。 我已经想出了如何解决这个问题,使我的代码工作,但它真的很困扰我不知道什么是在第一个例子中打破任务,因为我所了解的一切,迄今为止我已经了解到,他们应该正常工作。
这是我第一个使用C ++语言的大型项目,而且我还在学习,所以任何有经验的程序员的帮助或build议都会很棒。
谢谢!
编辑:
这里要求的是整个class级:
#include <list> #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 < (ss_screen->w - box.w)) box.x += moveSpeed; }
和标题:
#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
它缺少你函数中的最后一个返回指令:
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 }
然后你的函数返回任何(UB),如果你的任何b_canFire,b_shouldFire是假的。