состояние клавиатуры sfml или - PullRequest
0 голосов
/ 25 сентября 2018

Я новичок в программировании на 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 голосов
/ 25 сентября 2018

TL; DR: Нет, на самом деле нет никакого способа написать ваше «сложное» условие.


Общий синтаксис логического оператора или оператора: <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))
0 голосов
/ 25 сентября 2018

Примечание. Этот ответ отвечает только на ваш второй вопрос.Для первого вопроса взгляните на ответ программиста.

Вы можете попробовать его с помощью блока 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ко всему, где компилятор считает, что это имеет смысл (или лучше: он добавляет его, если есть функция, которая помещается в это пространство имен).

Вы можете прочитать больше здесь. Внизуони используют это очень похоже на то, что я сделал.

...