我是使用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))
我想知道为什么我的第一次尝试不起作用?以及我该怎么做才能做到这么简单?
答案 0 :(得分:3)
TL; DR:真的没有办法写出“复杂”条件。
逻辑或运算符的常规语法为<expression> || <expression>
。
在sf::Keyboard::Up||Down
中,左侧确实是一个表达式,但右侧不是。只是一个符号,可能甚至都没有声明,因此无法编译。
逻辑或运算符的结果为bool
或true
的{{1}}值。值false
可以隐式转换为true
,而值1
可以转换为false
。在相反的方向上,所有非零值都可以隐式转换为0
,而只有true
可以转换为0
。
如果我们采用整个表达式false
,并假设符号在没有任何作用域的情况下都是有效的,则该表达式等于sf::Keyboard::Up||Down||Left||Right
。
现在关于如何评估该表达式,它取决于那些符号的值。但是如果我们假设只有 one 可能为零,那么我们有
((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))
答案 1 :(得分:1)
注意:此答案仅回答您的第二个问题。对于第一个问题,请查看Some Programmer Dude的答案。
您可以使用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
添加到编译器认为有意义的所有内容(或者更好的方法是:如果存在适合该名称空间的函数,则将其添加)。
You can read up more here.在底部,它们的用法与我的用法非常相似。