Блокировка номера XNA влияет на ввод
У меня есть прерывание, которое на клавиатуре дает мне координирующую клавишу. Когда блокировка номера включена, ключи отображаются как Numpad1, Numpad2 и т. Д. Когда блокировка номера выключена, клавиши numpad превращаются в End, Left, Right, Up, PageLock... Я не могу, чтобы это происходило, потому что мне нужно сохранить эти клавиши (влево, вправо..) в качестве фактических клавиш со стрелками. Скорее всего, на вход вообще не влияет блокировка номера. Тем не менее, я не могу смягчить это, поскольку я получаю информацию от XNA напрямую. Может ли кто-то еще подтвердить, что это происходит в XNA 3.1 на VS 2008?
3 ответа
XNA внутренне использует функцию win32 GetKeyboardState
определить состояние клавиатуры. Эта функция не может различать цифровую клавиатуру, клавиши со стрелками и группу вставок.
Видимо, вы можете различать ключи с помощью WM_KEYDOWN
сообщение (и его друзья).
Я оставлю взаимодействие, необходимое для получения сообщений win32 в приложении XNA, и как проверить данные для сообщения в качестве упражнения.
(Лично я бы порекомендовал просто изменить схему управления. Или просто наблюдать за состоянием num-lock пользователя. Вообще говоря, это плохая идея - взять на себя функции чего-то вроде ключа num-lock!)
Я еще не проверил это, но Райан Рубли из Morpheus Development опубликовал здесь решение, которое стоит проверить:
http://xboxforums.create.msdn.com/forums/p/90944/545124.aspx
Вот полностью рабочее решение для использования цифровых клавиш независимо от статуса numlock и без включения numlock.
Создано Райаном Рубли 9-5-2011
Вы можете определить 2 ключа для каждого действия в вашей игре.
Например, вместо Keys.Left для перемещения влево, выделите для него еще один ключ (Numpad4).
В своем коде проверки ввода вы просто проверите, нажата ли любая из этих 2 клавиш:
Например:
if (IsKeyPressed(Keys.Numpad4) || IsKeyPressed(Keys.Left)
{
// Do some action.
}
Конечно, вы также можете создать метод, который принимает 2 ключа и выполняет это внутренне, без необходимости писать код каждый раз.