我是 c++ 编程的初学者
当我按下按钮时,我试图为我的角色制作动画。
所以我写了这个:
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up||Down||Left||Right)
{...
我找到了一个解决方案,但它是兼容的
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)||sf::Keyboard::isKeyPressed(sf::Keyboard::Down)||sf::Keyboard::isKeyPressed(sf::Keyboard::Right)||sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
我想知道为什么我的第一次尝试不起作用 - 以及我如何做尽可能简单的事情?
TL;大卫:不,真的没有办法写你的"复杂"条件。
逻辑或运算符的一般语法是<expression> || <expression>
。
sf::Keyboard::Up||Down
左手边确实是一种表达,但右手边不是。它只是一个可能甚至没有声明的符号,因此不会编译。
逻辑或运算符的结果是一个bool
值,可以是true
,也可以是false
。值true
可以隐式转换为1
,false
转换为0
。在相反的方向上,所有非零值都可以隐式转换为true
而只有0
值可以转换为false
。
如果我们把整个表达式sf::Keyboard::Up||Down||Left||Right
,并假设符号在没有任何作用域的情况下是有效的,则该表达式等于((sf::Keyboard::Up||Down)||Left)||Right
。
现在关于如何计算该表达式,这取决于这些符号的值。但是,如果我们假设只有一个可能是零,那么我们有
sf::Keyboard::Up||Down
将true
true||Left
将true
true||Right
这将是true
.
所以你的条件
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up||Down||Left||Right))
真的会
if(sf::Keyboard::isKeyPressed(true))
等于
if(sf::Keyboard::isKeyPressed(1))
使用Key
枚举将等于
if(sf::Keyboard::isKeyPressed(sf::Keyboard::B))
注意:此答案仅回答您的第二个问题。对于第一个问题,请看一些程序员的答案。
您可以使用using namespace
块尝试:
int main() {
// some code
{
using namespace sf::Keyboard;
if(isKeyPressed(Up) || isKeyPressed(Down) ||
isKeyPressed(Right) || isKeyPressed(Left)) {
//some stuff
}
}
//more code
}
简单来说,using namespace sf::Keyboard
会向编译器认为有意义的所有内容添加sf::Keyboard
(或者更好:如果有适合该命名空间的函数,它会添加它(。
您可以在此处阅读更多内容。在底部,他们使用它与我所做的非常相似。