2012-05-21 1 views
4

Im пытается получить ключ вход в SFML 2, в SFML 1.6 им с использованиемKeyboard Event SFML 2,0

while (App.GetEvent(Event)) 
     { 
      if (App.GetInput().IsKeyDown(sf::Key::Down)) { dir='d'; } 
    } 

Но я понятия не имею, как это сделать в SFML 2.

+0

Документация содержит всю необходимую информацию: http://sfml-dev.org/documentation/2.0/ –

+0

http://sfml-dev.org/documentation/2.0/classsf_1_1Event.php, если быть точным – elimirks

ответ

14

Когда ты вам не нужно беспокоиться о вводе в реальном времени клавиатуры, вы можете использовать подход, очень похожий на предоставленный вами SFML-код 1.6. В цикле обработки событий вашего приложения, вы можете сделать что-то вроде этого:

sf::Event event; 
while (mWindow.pollEvent(event)) 
{ 
    if (event.type == sf::Event::KeyPressed) 
    { 
     if (event.key.code == sf::Keyboard::Escape) 
     { 
      // Do something when Escape is pressed... 
     } 
     if (event.key.code == sf::Keyboard::W) 
     { 
      // Do something when W is pressed... 
     } 

     // And so on. 
    } 
} 

Этого типа обработки ввода приятно, когда вы должны гарантировать ваше приложение имеет фокус, когда пользователь нажимает клавишу, а ключевые события не генерируются в противном случае. Это также здорово, когда ключевой вопрос нажимается нечасто. Вы можете посмотреть пример этого из учебников SFML 2.0 здесь, в разделе «События KeyPressed и KeyReleased»: http://sfml-dev.org/tutorials/2.0/window-events.php

С другой стороны, вам действительно может потребоваться доступ к клавиатуре в реальном времени. Для этого используется класс Keyboard SFML 2.0 как это:

if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) 
{ 
    // 'W' is currently pressed, do something... 
} 

С вводом в реальном времени, вы получаете доступ состояние устройства ввода в данный конкретный момент времени. Это удобно, потому что вам не нужно блокировать все проверки ключей в цикле обработки событий. Недостатком такого подхода является то, что SFML просто считывает состояние клавиатуры, ваш код обработки событий все равно может выполняться, если приложение не имеет фокуса, минимизировано и т. Д. Вы можете найти учебник по всем входам в реальном времени здесь: http://sfml-dev.org/tutorials/2.0/window-inputs.php

Будьте осторожны при выборе процесса обработки событий в реальном времени. Для примера игры рассмотрите ситуацию, когда персонаж запускает пулемет, когда пользователь удерживает пробел. Если вы обрабатываете пробел в цикле обработки событий, пулемет неправильно срабатывает, как полуавтоматический, так как существует задержка между sf::Event::KeyPressed событиями для одного и того же ключа, даже если пользователь удерживает клавишу нажатой. Если вы обрабатываете пробел, проверяя ввод в реальном времени клавиатуры, пулемет будет срабатывать многократно, как и ожидалось.