Локализация _getch()

Рейтинг: 0Ответов: 2Опубликовано: 26.05.2023

Всем привет. Делаю змейку в консоли. Сейчас "локализовывал" её, чтобы работала и с английской, и с русской раскладкой. Заметил интересную особенность функции _getch(); Такой вариант будет работать с русскими символами: switch(char(_getch())), а такой нет: switch(_getch()). Кто знает с чем это связано?

P.S. Также, если знаете, как сделать считывание определенной клавиши независимо от раскладки, будь то хоть японская, китайская или любая другая, дайте, пожалуйста, совет, или ссылку на информацию.

   void Input() {
        if (_kbhit()) {
            switch (char(_getch()))
            {
            case 'a':
            case 'ф':
                dir = LEFT;
                break;
            case 'd':
            case 'в':
                dir = RIGHT;
                break;
            case 'w':
            case 'ц':
                dir = UP;
                break;
            case 's':
            case 'ы':
                dir = DOWN;
                break;
            case 'x':
            case 'ч':
                gameOver = true;
                break;
            }
        }
    }

Ответы

▲ 1

switch(char(_getch())), а такой нет: switch(_getch()). Кто знает с чем это связано?

_getch() возвращает int, а не char.

Для русской буквы 'а' c с кодом E0 integer будет иметь значение 000000E0 , то есть 224. А char у Microsoft (вроде бы) знаковый, то есть при сравнении с integer значение E0 типа char будет расширено до FFFFFFE0, то есть -32. Естественно что -32 не равно 224.

как сделать считывание определенной клавиши независимо от раскладки

через WinAPI отслеживать события клавиатуры, которые присылают Scan Code, независимые от раскаладки.

▲ 0

Извращенец! Жесткий извращенец!!!

Для винды - GetAsyncKeyState() вернет VK для зажатой кнопки.

Для линухи - /dev/input/by-path/*-kbd - вернет состояние. Есть еще пару способов можно рассмотреть.

А вообще змейку на SDL сделать куда практичнее и интереснее будет.