Простой способ получить текущее нажатие клавиши - PullRequest
0 голосов
/ 05 июля 2018

Я начал использовать SFML в качестве своей базовой графической среды для редактора кода, над которым я работаю, единственное, что я не могу понять, правильно - это ввод с клавиатуры.

То, к чему я привык в QB64 (язык, похожий на Visual Basic), - это получение нажатий клавиш с помощью команды _keyhit (которая возвращает виртуальный код клавиши) или команды $ inkey (которая напрямую возвращает символ текущего нажатия клавиши). ). Я ищу подобное решение в C ++ (не обязательно кроссплатформенное, возможно, легко реализуемое вместе с SFML)

На данный момент я пробовал использовать _getch, который, похоже, не работает ни с фреймворком Windows, ни с SFML, возможно, мне следует использовать некоторые подпрограммы Windows.h для этой цели, но исходя из того, что Я видел, эти проверки для конкретных нажатий клавиш, не совсем то, что мне нужно. Фреймворк SFML предоставляет "sf :: Keyboard :: isKeyPressed", но он также проверяет определенное нажатие клавиши, но не всю клавиатуру, я также попытался создать массив, который служит картой из "sf :: Keyboard: : Клавиша "enum для символов ASCII, но это не убедительно, кроме того, клавиши, кажется," прилипают ", и символ нажатой клавиши продолжает читаться даже после его отпускания.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Если вы просто хотите обнаружить нажатие клавиши, функция kbhit () - это функция (семейство компиляторов Borland, conio.h, но не часть стандартов C ++, когда я ее гуглял). https://www.cprogramming.com/fod/kbhit.html

Альтернатива: в Unix-подобной операционной системе вы можете использовать ncurses для эмуляции большинства поведения conio (посмотрите, работает ли оно для вас) https://www.quora.com/With-which-function-can-I-replace-kbhit-in-C++-because-the-header-conio-h-doesnt-exist-in-linux

Если вы ищете код, который может определить, какая клавиша была нажата (например, цифровая клавиатура 1 и 1 над алфавитами или что-то вроде клавиш Esc или стрелок). Этот код работал для меня на borland-компиляторе. Когда вы выбираете код сканирования (не ascii), он отличается для каждой клавиши на клавиатуре (даже у не ascii есть значение)

void getkey()
{
union REGS ii,oo;
while(!kbhit());
ii.h.ah=0;//service no for ascii and scan code
int86(22,&ii,&oo);
ascii=oo.h.al;
scan=oo.h.ah;
}

Я использовал приведенный выше код в своем школьном проекте, поэтому я не помню точный источник, где я его нашел. Но я думаю, что это был Let C от Yashwant Kanetkar под частью GUI (он был удален позже, так что вы ищу публикацию до 2008 года).

Надеюсь, это поможет.

0 голосов
/ 05 июля 2018

Если вы используете SFML, это на самом деле довольно просто. Вам необходимо использовать класс sf :: Event :: KeyEvent (или в этом случае struct).

https://www.sfml -dev.org / документация / 2.5.0 / structsf_1_1Event_1_1KeyEvent.php

Хотя выгода в том, что вы должны получить событие от чего-то. Обычно это используется из окна SFML.

//assuming your code is already set up for these items...
sf::Event Event;
while (window.GetEvent(Event))
{
    if (Event.Type == sf::Event::KeyPressed)
    {
         //to get the key code, use Event.Key.Code
         //your code
         //for example
         switch(Event.KeyEvent.Code)
         {
             case(sf::Keyboard::Key::Y):
                 //do stuff
                 break;
         }
    }
}

Кстати, я давно работал с SFML, поэтому я не уверен на 100%, будет ли он работать с операторами switch. Сравнение с == также сработает в выражении if-else if-else. Также могут быть другие способы получить sf::Event, определенный без окна. В противном случае это довольно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...