Информация о мусорной клавиатуре в SDL 2.0 - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть следующий код для проверки ввода с клавиатуры SDL в версии 2.0:

while (SDL_PollEvent(&evnt))
        {
            if (evnt.type == SDL_KEYDOWN)
            {
                board = evnt.key;
                key = board.keysym.sym;

                switch (key)
                {
                    case SDLK_a:
                        printf("a key!\n");
                        break;

                    case SDLK_d:
                        printf("d key!\n");
                        break;

                    default:
                        printf("Code: 0x%X\n", board.keysym.scancode);
                        printf("Name: %s\n", SDL_GetKeyName(key));
                        printf("Hex:  0x%02X\n", key);
                        printf("Uni:  %c\n\n", (char)board.keysym.unicode);
                }
            } else if (evnt.type == SDL_QUIT)
                running = false;
        }

Однако для последовательности 'qwerty' приведен следующий вывод:

Code: 0x460001
Name: ¶
Hex:  0x14
Uni:

Code: 0x460001
Name: →
Hex:  0x1A
Uni:

Code: 0x460001
Name: Backspace
Hex:  0x08
Uni:

Code: 0x460001
Name: §
Hex:  0x15
Uni:

Code: 0x460001
Name: ↨
Hex:  0x17
Uni:

Code: 0x460001
Name: ∟
Hex:  0x1C
Uni:

Am Iпросто делать что-то глупое?

Кроме того, это не идеальный метод для моей программы.Я бы предпочел сделать
, если (ispressed ['k'])
{}
и т.д ...

Есть ли возможность выполнить эту форму обработки ввода в SDL или будетМне нужно написать свой собственный класс, чтобы управлять им?

1 Ответ

0 голосов
/ 03 апреля 2013

Оператор switch в основном является оператором if.

Если вы действительно хотите сделать это по-своему, это выглядело бы как

if (event.type == SDL_KEYDOWN)
        {
            board = evnt.key;
            key = board.keysym.sym;

            if(key==SDLK_a)
            {
                //do stuff here
            }

Если вы хотите, чтобы он выглядел в точности так, как вы сказали выше, вам нужно определить MAP bools, называемый isPressed, и всякий раз, когда вы получаете ключевое событие, передайте его помощнику, который установит значения на карте. на основе нажатой клавиши. Я скажу вам сейчас - привыкните к тому, как SDL «хочет», чтобы вы это делали. Когда вам будет удобнее, вы поймете, что в этом больше смысла.

Что касается ошибки, с которой вы столкнулись - я не слишком уверен в ее части, но попробуйте поставить SDL_EnableUNICODE (); в вашей инициации. Затем выполните тестирование на том же входном сигнале и доложите - я ожидаю, что это по крайней мере решит вашу проблему с юникодом.

...