Как принять живой ввод с клавиатуры? - PullRequest
0 голосов
/ 08 декабря 2010

В настоящее время я пишу программу на с ++, которая очень похожа на классическую программу «змея» с некоторыми изменениями. Я пишу это так, что он будет обновлять экран пять раз в секунду, основываясь на ctime, возможно, больше, если это можно будет обработать. Одна вещь, которую я хотел бы сделать, это сделать так, чтобы в файле .h была переменная «currkeypressed». Эта переменная будет удерживать клавишу, которую пользователь в данный момент удерживает, и змеиная голова пойдет в этом направлении. Каждый узел в змее будет отдельным объектом, поэтому нажатие курсора будет влиять только на голову. Направленные и локационные данные будут передаваться по змее от узла к узлу при каждом обновлении.

Мой вопрос: как я могу заставить программу хранить эти данные постоянно, а не обновлять только с cin при нажатии клавиши или через определенный интервал? Я знаю, что могу принять значение ascii для клавиш со стрелками в некотором цикле for, но, похоже, это не сработает, если удерживать клавишу нажатой и если цикл очень длинный, он может пропустить нажатие. Кто-нибудь знает, как это сделать?

РЕДАКТИРОВАТЬ: я использую ОС Linux, точнее Ubuntu

Ответы [ 4 ]

1 голос
/ 08 декабря 2010

Самый простой способ - использовать библиотеку ncurse .

Однако , если вы предпочитаете "сырое" программирование Linux, вы можете использовать select и getchar:

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
      fd_set readfs;
      struct timeval timeout;
      int res, key;

      while (1) {
         /* .. do something else .. */

         FD_SET(0, &readfs);  /* 0 is STDIN */
         timeout.tv_usec = 10;  /* milliseconds */
         timeout.tv_sec  = 0;  /* seconds */
         res = select(maxfd, &readfs, NULL, NULL, &timeout);
         if (res) {
            /* key pressed */
            key = getchar();
            if (key == 'A')  { /* blar */ }
         }
      }
}
1 голос
/ 08 декабря 2010

Когда вы смотрите за пределы простого линейно-ориентированного или буквенно-ориентированного ввода, вы попадаете в детали устройства пользовательского ввода.Каждая операционная система имеет определенный механизм для уведомления программы о событиях, таких как keydown и keyup.

Чтобы получить ответ, добавьте тег, для которого вы находитесь в среде программирования: MSWindows, Linux, Android, MacOS и т. Д.

0 голосов
/ 03 февраля 2016

Вы можете использовать библиотеку conio.h, и вы можете использовать функцию _getch() в цикле, чтобы получить живой ввод без каких-либо ограничений.

#include<conio.h>
#include<iostream>
using namespace std;
int main()
{
    char n='a';//Just for initialization 
    while(n!='e') 
    {
        n=_getch();
    }
    return 0;
}
0 голосов
/ 08 декабря 2010

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

...