2014-01-22 6 views
0

В настоящее время я слушаю входы клавиатуры через getch(), а цикл работает отлично. Однако, если я удерживаю левую кнопку и нажимаю вверх, левое движение останавливается, пока я не нажму его снова. Единственный способ, который я могу придумать для решения этого, требует знания того, удерживается ли ключ/когда он выпущен. Я использую ncurses, которые предположительно обладают этой способностью, но через все мои поиски я не нашел ничего полезного.C++ Дифференцирование нажатия клавиши vs Key Release

Тетрис фрагмент кода в вопросе:

int ch = getch(); 
while(ch != 'x') { 
    // Handle arrow keys first 
    if (ch == '\033') { 
     getch(); // Get rid of slash 
     switch (getch()) { 
     case 'A': rotate(); redraw(); break; // Up 
     case 'B': move(DOWN); redraw(); break; // Down 
     case 'C': move(RIGHT); redraw(); break; // Right 
     case 'D': move(LEFT); redraw(); break; // Left 
     } 
    } else { 
     switch(ch) { 
     // Stuff not relevant to this question 
     } 
    } 
    ch = getch(); 
} 

ответ

0

Эта проблема является более сложной, чем вы думаете. Это называется клавиатурным ореолом. Чтобы обеспечить одновременное нажатие нескольких клавиш, вам может потребоваться специальная клавиатура, которая обеспечивает функцию против ореолов, или вам, возможно, придется переназначить клавиатуру в соответствии с этой статьей. Read it here для получения более подробной информации.

+0

Вы уверены, что сталкивается с этой проблемой? Я думаю, он спрашивает о keyListener –

+1

Да, я уверен, проблема в том, что нажатые ключевые сигналы не доходят до аппаратного обеспечения. Несколько дней назад у меня была аналогичная проблема, я работал над SDL, и я сделал игру RPG, в которой мне пришлось переместить моего персонажа в 8 направлениях. Верх + левая, верхняя + правая, нижняя + левая, нижняя + правая и т. Д. Проблема заключалась в том, что при нажатии верхней клавиши и нажатии левой клавиши. Персонаж перестал двигаться вверх. Я убедился, что SDL_EnableKeyRepeat() включен, и проблема по-прежнему сохраняется. Поэтому я прочитал об этой статье и изменил contorls. Теперь он отлично работает. Это проблема с оборудованием. Довольно понятно. – kotAPI

+0

@OMerObaid, также не является ключевой функцией java? Я думал, что это вопрос на C++. – kotAPI

0

Решение должно работать под Linux?

+0

нет Геч() функции в Linux STDLIB, вам нужно использовать как этого л '#include #include #include INT mygetch() { структуру termios oldt, тритона; int ch; tcgetattr (STDIN_FILENO, & oldt); newt = oldt; newt.c_lflag & = ~ (ICANON | ECHO); tcsetattr (STDIN_FILENO, TCSANOW, & newt); ch = getchar(); tcsetattr (STDIN_FILENO, TCSANOW, & oldt); return ch; } ' –

 Смежные вопросы

  • Нет связанных вопросов^_^