Независимое от платформы обнаружение нажатия клавиши со стрелкой в ​​C++

В консольной программе C++ я нашел, как обнаруживать клавиши со стрелками в Windows, и я нашел много других вещей, которые не имели ничего общего с вопросом (несмотря на то, что я думал, что это хорошие условия поиска), но я хотите знать, есть ли независимый от платформы способ обнаружения нажатия клавиши со стрелкой. Достойным вторым местом для этого было бы то, как обнаружить нажатие клавиши со стрелкой в ​​Unix и Mac. Фрагменты кода приветствуются.


person JnBrymn    schedule 12.09.2010    source источник


Ответы (3)


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

Я считаю, что библиотека, которую вы ищете в POSIX-боксах, это curses, но я никогда не использовал его сам - я могу ошибаться.

Имейте в виду, что вполне возможно, что консольная программа (то есть gnome-terminal или konsole или xterm) монополизировала использование этих клавиш для других функций.

person Billy ONeal    schedule 12.09.2010

Как сказал Билли, стандартного кроссплатформенного способа сделать это не существует.

Лично я использую эту (ориентированную на игру) библиотеку для всех входных данных, кросс-платформенных win/linux/mac: http://sourceforge.net/projects/wgois/

person Klaim    schedule 12.09.2010
comment
Проект перемещен на Github: github.com/wgois/OIS - person Richard Dally; 26.07.2020

Вы можете сделать это на разных платформах, используя SDL2.

Пример кода:

    #include <SDL2/SDL.h>

    int main()
    {
        SDL_Event event;

        SDL_PollEvent(&event);

        if(event.type == SDL_KEYDOWN)
        {
            // Move centerpoint of rotation for one of the trees:
            switch(event.key.keysym.sym)
            {
                case SDLK_UP:
                    // do something
                    break;
                case SDLK_DOWN:
                    // do something
                    break;
                case SDLK_LEFT:
                    // do something
                    break;
                case SDLK_RIGHT:
                    // do something
                    break;
                case SDLK_ESCAPE:
                    // do something
                    return 0;
                default:
                    break;
            }
        }

        return 0;
    }
person metamorphosis    schedule 04.01.2018
comment
Я запускаю это на Ubuntu 18.04, и оно не компилируется... undefined reference to `SDL_PollEvent' collect2: error: ld returned 1 exit status Что я делаю не так?? Я буквально просто скопировал этот код и скачал библиотеку... - person Abraham Murciano Benzadon; 18.10.2018
comment
@AbrahamMurcianoBenzadon, если это неопределенная ссылка, которую вы неправильно связываете с библиотеками - изучите документацию SDL, учебные пособия по SDL и то, на что и в каком порядке вы должны ссылаться в своей ОС / компиляторе. - person metamorphosis; 19.10.2018