【问题标题】:sfml keyboard condition orsfml 键盘条件或
【发布时间】:2019-03-01 00:40:47
【问题描述】:

我是 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))

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

【问题讨论】:

  • 您为什么认为第一个解决方案会起作用?看来您应该从a good C++ book 开始。您可以添加using namespace sf::Keyboard; 以避免每次都重复此部分,但除此之外它尽可能简单(并且您的API 允许)。你也可以把它提取到一个函数中(即isArrowKeyPressed()),然后你只需要调用这个函数。
  • 也可以使用std::any_of

标签: c++ sfml


【解决方案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. 在底部,他们使用它与我所做的非常相似。

【讨论】:

  • 好的,但是有人说我们using namespace 是不可取的。 1还是0这样?
  • @Jules 不知何故是的,但在这种情况下不是(那么多)。 Here you can see why it is considered bad。如果您在全球范围内使用它可能会很糟糕。如果您在 { } 内使用命名空间,则将其使用限制在这个小空间内。这样,您得到误解的可能性要小得多。你还是要留心一点。
【解决方案2】:

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


逻辑或运算符的一般语法是<expression> || <expression>

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


逻辑或运算符的结果是bool 值,truefalse。值true 可以隐式转换为1false0。在相反的方向上,所有非零值都可以隐式转换为true,而只有0 可以转换为false

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

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

  • 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))

使用the Key enumeration 等于

if(sf::Keyboard::isKeyPressed(sf::Keyboard::B))

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 2012-12-27
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多