Блокировка номера XNA влияет на ввод - PullRequest
2 голосов
/ 17 мая 2011

У меня есть прерывание, которое при нажатии клавиш клавиатуры дает мне координирующую клавишу.Когда блокировка номера включена, ключи обозначаются как Numpad1, Numpad2 и т. Д. Когда блокировка номера выключена, клавиши numpad превращаются в End, Left, Right, Up, PageLock ... Я не могу этого сделать, потому чтосохранить эти клавиши (влево, вправо ..) в качестве фактических клавиш со стрелками.Я бы предпочел, чтобы на вход вообще не влияла блокировка номера.Тем не менее, я не могу смягчить это, поскольку я получаю информацию от XNA напрямую.Может ли кто-нибудь еще подтвердить, что это происходит в XNA 3.1 на VS 2008?

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

XNA внутренне использует функцию win32 GetKeyboardState для определения состояния клавиатуры.Эта функция не может различать цифровую клавиатуру, клавиши со стрелками и группу вставок.

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

Я оставлю взаимодействие, необходимое для получения сообщений win32 в приложении XNA, и способ проверки данных для сообщения в качестве упражнения.

(Лично я бы порекомендовал простоизменение вашей схемы управления. Или просто наблюдение за состоянием num-lock пользователя. Вообще говоря, это плохая идея взять на себя функции чего-то вроде ключа num-lock!)

0 голосов
/ 09 августа 2013

Я еще не подтвердил это, но Райан Рубли из Morpheus Development разместил здесь решение, которое стоит проверить:

http://xboxforums.create.msdn.com/forums/p/90944/545124.aspx#545124

Вот полностью работающийрешение использовать цифровые клавиши независимо от статуса numlock и без включения numlock

Создано Райаном Рубли 9-5-2011

0 голосов
/ 18 мая 2011

Вы можете определить 2 ключа для каждого действия в вашей игре.

Например, вместо Keys.Left для перемещения влево выделите для него другую клавишу (Numpad4).

В своем коде проверки ввода вы просто проверите, нажата ли любая из этих 2 клавиш:

Например:

if (IsKeyPressed(Keys.Numpad4) || IsKeyPressed(Keys.Left)
{
    // Do some action.
}

Конечно, вы также можете создать метод, который принимает 2 ключа и выполняет это внутренне, без необходимости каждый раз писать код.

...