Я работал над одной из этих игр со змеями, и у меня есть оператор переключения, который говорит, что если нажата клавиша, чтобы переместить змею в направлении, увеличивая / уменьшая ее, но это будет сделано только в том случае, если я удержу ее. Я ищу способ увеличения местоположения змей без удержания пользователем этой клавиши. Я поставил один случай ниже
if(_kbhit()) {
switch(_getch()) {
case 'a' :
dir = LEFT;
x--;
Я ищу способ иметь … продолжать наращивать без пользователя
держа этот ключ. «
ИМХО, вы должны рассмотреть функцию «select ()» (если она доступна в вашей ОС)
Давным-давно я использовал «select ()» в vxWorks. На странице руководства я вижу, что эта функция также доступна для Ubuntu Linux. (может быть, это доступно для вашей системы?)
С помощью оператора select поток или программа могут «отслеживать несколько файловых дескрипторов, ожидая, пока один или несколько файловых дескрипторов станут« готовыми »для некоторого класса операций ввода-вывода (например, возможен ввод). Дескриптор файла считается готовым, если». можно выполнить соответствующую операцию (например, read () без блокировки или достаточно маленькую запись ()). » (со страницы руководства)
На практике в системе, над которой я работал, поток чтения пользовательского интерфейса (один из нескольких) выдавал и контролировал ввод fd (через select) для ввода данных пользователем. Наш выбор использовал время ожидания 1/2 секунды (вы выбираете скорость). Таким образом, каждые полсекунды, если на этом порту (т.е. устройстве) не было введено никакого пользовательского ввода, тайм-аут высвобождает программу для проверки битов в fd_sets.
Ничто не мешает коду выполнять дополнительные действия в течение времени ожидания.
Я предполагаю, что вам нужно будет работать только с readfds, а остальные можно оставить пустыми.
Другими словами, с помощью select ваш код «отслеживает» некоторый пользовательский ввод по истечении времени ожидания и выполняет действия либо по пользовательскому вводу (нажатие клавиши), либо по истечении времени ожидания.
Это звучит как то, что вы ищете — действие без нажатия клавиши.
Ваш текущий дизайн звучит так, как будто он двигает змею на прессе.
Я думаю, что вы хотите изменить дизайн так, чтобы события нажатия обновляли некоторый флаг текущего направления, в то время как некоторый фоновый поток таймера перемещает змею с некоторой регулярной частотой кадров.
Ваш код только перемещает змею при нажатии клавиши. Вам нужно реализовать какой-то игровой цикл, который перемещает змею с регулярным интервалом на основе direction
переменная. Затем вы можете изменить код нажатия клавиши, чтобы просто обновить direction
,
Псевдокод:
while: # loop forever
# below could be your switch statement
if direction == 0: # north
y--
if direction == 1: # east
x++
if direction == 2: # south
y++
if direction == 4: # west
x--
if _kbhit():
if _getch() == 'a':
direction == 4 # west
# etc...