SFML 键盘条件或



我是 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可以隐式转换为1false转换为0。在相反的方向上,所有非零值都可以隐式转换为true而只有0值可以转换为false

如果我们把整个表达式sf::Keyboard::Up||Down||Left||Right,并假设符号在没有任何作用域的情况下是有效的,则该表达式等于((sf::Keyboard::Up||Down)||Left)||Right

现在关于如何计算该表达式,这取决于这些符号的值。但是,如果我们假设只有一个可能是零,那么我们有

  • sf::Keyboard::Up||Downtrue
  • true||Lefttrue
  • 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(或者更好:如果有适合该命名空间的函数,它会添加它(。

您可以在此处阅读更多内容。在底部,他们使用它与我所做的非常相似。

最新更新