Как пользовательский ввод не зависит от FPS при использовании, например, Java Slick 2D или .NET XNA framework? - PullRequest
0 голосов
/ 16 марта 2011

В прошлом я написал несколько 2D-игр, используя библиотеки, такие как LWJGL (с оберткой Slick2D) и платформу XNA, но одна вещь, которую я никогда не мог понять (или мне нужно), это то, как пользовательввод остается постоянным, eq не зависит от FPS.

Я ищу более общий ответ, а не специфический для фреймворка.Я так понимаю, это как-то связано со временем, измеренным между обновлениями кадров?

Спасибо

1 Ответ

1 голос
/ 16 марта 2011

Я не могу говорить о некоторых из этих других фреймворков, но я знаю, что XNA в основном позволяет вам опрашивать текущее состояние ввода (кнопки вверх или вниз?) В любое время. Вы обычно делаете это каждый кадр.

Это означает, что если ваш игрок является ниндзя и может нажимать клавиши быстрее, чем 60FPS, возможно, что они могут нажать клавишу (или кнопку мыши) между опросами, и вы пропустите это. На практике это почти никогда не является проблемой.

Если это вас беспокоит, решение этой проблемы - подключить насос сообщений Windows и получать события клавиатуры вверх / вниз.

Для общего игрового процесса это действительно не стоит усилий. Обычно единственное время, когда вы действительно должны фиксировать каждое нажатие клавиши, - это когда пользователь печатает текст. Поэтому вместо захвата событий клавиш вверх / вниз вы фиксируете события персонажа (WM_CHAR). Это означает, что вы не пропустите нажатие клавиши. Но более важная проблема, которую он решает, заключается в том, что он переносит преобразование ключа в символ в Windows - что позволяет ему обрабатывать повтор клавиатуры, раскладку клавиатуры, сдвинутые символы и т. Д. - позволяя вашей игре вести себя как любое другое приложение Windows. .

(Конечно, если вы можете обойтись без простого использования входных данных фреймворка, основанного на опросе - продолжайте в том же духе - это намного проще реализовать и меньше зависит от платформы.)


Вышеуказанное имеет значение, только когда вы обнаруживаете различные нажатия клавиш (например, нажмите, чтобы выстрелить из этого пистолета), а не удерживаете клавиши в нажатом положении (например: ускорение этого транспортного средства).

Альтернативная интерпретация вашего вопроса заключается в том, что вы предполагаете, что ключ может появиться на полпути через фрейм - как вы это учитываете в игре с дискретным временным шагом?

Как правило, вы не беспокоитесь об этом. Так же, как 60 кадров в секунду достаточно быстры, чтобы дискретно вычислить состояние вашей игры и казаться человеку плавным и непрерывным, это достаточно быстро, чтобы принять ввод.

Но что произойдет, если вы не используете 60FPS? Если вы используете 30FPS (как на мобильной платформе), тогда ваши входы - особенно аналоговые входы - будут намного плавнее, если вы наберете 60FPS. Самый простой способ сделать это - просто сделать два Update с для каждого Draw - если ваше Обновление не слишком обременительно для ЦП.

...