Я знаю, что это старый вопрос, но я хотел бы ответить на него, чтобы помочь другим, кто может оказаться здесь, испытывающим подобные проблемы.
SFML 1.6 имеет два способа получения информации от пользователя. Один основан на событиях, где вы обрабатываете каждое событие, отправленное вам через sf::Window::GetEvent()
. Другое основано на запросах, где вы проверяете класс sf::Input
вашего окна напрямую.
Вы использовали здесь метод, основанный на запросах, но поместили его в цикл обработки событий, который на самом деле не был таким, как предполагалось. Это должно было быть использовано как это. Это хорошая функция, потому что SFML по сути хранит для вас булеву таблицу ключей, поэтому вам не нужно самостоятельно управлять состояниями ключей. ИМХО для использования повторяющегося ввода это более элегантно, поскольку вы не будете рассылать спам в очереди событий, просто проверив логическое значение.
while(app.GetEvent(event))
if(event.Type == sf::Event::Closed) running=false;
if(event.Type == sf::Event::KeyPressed && event.Key.Code == sf::Key::Right)
{
// move right
}
}
Если вы хотите просто запросить sf :: Input напрямую, тогда вы используете тот же код, что и выше, но вы помещаете его вне цикла обработки событий.
while(app.GetEvent(event)
{
}
if (myWindow.GetInput().IsKeyDown(sf::Key::Right))
{
}
По умолчанию автоматическое повторение ключа должно быть включено для sf :: Windows, но вы можете убедиться с помощью sf::Window::EnableKeyRepeat(true)
. Это означает, что он будет отправлять событие KeyPressed
несколько раз, пока нажата клавиша.
Попробуйте использовать метод на основе запросов вне основного цикла событий и посмотрите, подходит ли он вам.