sfml键盘状况或

时间:2018-09-25 11:39:18

标签: c++ 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))

我想知道为什么我的第一次尝试不起作用?以及我该怎么做才能做到这么简单?

2 个答案:

答案 0 :(得分:3)

TL; DR:真的没有办法写出“复杂”条件。


逻辑或运算符的常规语法为<expression> || <expression>

sf::Keyboard::Up||Down中,左侧确实是一个表达式,但右侧不是。只是一个符号,可能甚至都没有声明,因此无法编译。


逻辑或运算符的结果为booltrue的{​​{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))

使用the Key enumeration等于

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::Keyboardsf::Keyboard添加到编译器认为有意义的所有内容(或者更好的方法是:如果存在适合该名称空间的函数,则将其添加)。

You can read up more here.在底部,它们的用法与我的用法非常相似。