如何仅在前面所有条件都为假时执行一个块,并在其中一个条件为真时执行一个特定的块
How to execute a block only if all previous conditions were false and execute a specific block if one of them was true?
我正在用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
设置为相应的值。如果none为true,则设置状态为State::Still
。我的代码可以工作,但是感觉我做错了。一定有更好的办法。我的问题是:
如何仅在所有指定条件失败时执行块,并在一个或几个为真时执行特定于每个这些条件的块,而不像我那样使用嵌套的if
和许多||
操作符?
我认为你可以这样做:
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解决方案,即使用布尔值
摘自评论中的点点滴滴。可能是这样的(假设没有一个移动状态的值为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;
或者,如果您有更多类似于移动块的代码块,您可以创建一个临时状态变量,以相同的方式处理它并合并临时状态和原始状态。
如果State::仍然不是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;
也可能有嵌套的方法,但它非常丑陋,可能没有更好的性能。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 为什么我的最后一个 ELSE 条件无法正确执行
- C++将一个指针分配给另一个指针时执行的类型检查
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何制作一个只能在一个线程上同时执行的函数?
- 编写一个读取五个整数并执行一些任务的C++程序
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 为什么循环体中的一个基本算术运算执行得比两个算术运算慢
- 为什么其中一个 while 循环没有被执行 (C++)?
- readAll() 或 readAllStandardOutput() 在执行之前也返回一个空字符串
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 是否可以在每次使用std::cout时执行一个函数
- 在使用PyInstaller冻结Python脚本时包含一个C++可执行文件
- 如何创建一个函数来执行其中的其他函数
- 哪一个执行起来更快
- 在一个执行函数中使用多个终端命令
- 我不能得到一个执行加载函数在使用Qt库工作