1

我正在用 C++ 制作一个小游戏,我想知道如何优化我的分支。看看这段代码:

if (
  isUpPressed ||
  isDownPressed ||
  isLeftPressed ||
  isRightPressed ||
  isSpacePressed
) {
  if (isUpPressed)
    state |= State::MoveUp;
  if (isDownPressed)
    state |= State::MoveDown;
  if (isLeftPressed)
    state |= State::MoveLeft;
  if (isRightPressed)
    state |= State::MoveRight;
  if (isSpacePressed)
    state |= State::Jump);
} else
  state = State::Still;

我想要实现的是:如果按下了上、下、左、右或空格,则设置state为适当的值。如果这些条件都不成立,请将状态设置为State::Still。我的代码有效,但感觉好像我做错了。一定会有更好的办法。我的问题是:
如何仅在所有指定条件都失败时执行块,如果一个或多个条件为真,则执行特定于每个条件的块,而不像我一样使用嵌套if和大量运算符?||

4

3 回答 3

3

我认为你可以这样做:

state = State::Still;

if (isUpPressed)
  state |= State::MoveUp;
if (isDownPressed)
  state |= State::MoveDown;
if (isLeftPressed)
  state |= State::MoveLeft;
if (isRightPressed)
  state |= State::MoveRight;
if (isSpacePressed)
  state |= State::Jump;

这样,如果没有按下任何键,state则设置为Still

如果state之前不是 0,则可以使用 meneldal 解决方案,即使用布尔值。

于 2014-06-17T13:01:22.320 回答
2

取自评论中的点点滴滴。可能是这样的(假设没有一个运动状态保持值 0)

State::Value state = State::Value(0);
if (isUpPressed)
    state |= State::MoveUp;
if (isDownPressed)
    state |= State::MoveDown;
if (isLeftPressed)
    state |= State::MoveLeft;
if (isRightPressed)
    state |= State::MoveRight;
if (isSpacePressed)
    state |= State::Jump);

if(state == State::Value(0))
    state = State::Still;

if(isOnFire)
    state |= State::Fire;

或者,如果您有更多类似于移动块的代码块,您可以创建一个临时状态变量,以相同的方式处理它并将临时状态和原始状态合并。

于 2014-06-17T13:45:47.953 回答
2

如果 State::Still 不是 0,您可以在每个分支中设置一个布尔值。设置布尔值是一项非常快速的操作,因此它可能比您的第一种方法更快。例如

bool still=true;

if (isUpPressed)
  still=false, state |= State::MoveUp;
if (isDownPressed)
  still=false, state |= State::MoveDown;
if (isLeftPressed)
  still=false, state |= State::MoveLeft;
if (isRightPressed)
  still=false, state |= State::MoveRight;
if (isSpacePressed)
  still=false, state |= State::Jump;
if(still)
  state=State::Still;

也可能有嵌套方法,但它非常丑陋,而且性能可能不会更好。

于 2014-06-17T13:35:26.790 回答