Написание игрового цикла для игры ncurses?

Я пишу игру с ncurses, и у меня проблемы с игровым циклом. Я прочитал эти 2 страницы - этот, и этот, а также несколько других, связанных через SO, и могут просто понять их (или, по крайней мере, я могу понять, о чем он говорит, если не точно, как работает решение), Проблема в том, что с ncurses, спрайты перемещают только один шаг за один раз, нет интерполяции или интеграции, это просто sprite.x=sprite.x+1. Я пробовал использовать pthread и nanosleep, а плохие парни спрайты идут хорошо, но движение игрока вяло и не реагирует/не реагирует. Я пробовал использовать 2 потока и имел ключевой ввод в один и игровой цикл на другой поток, но ключевой поток ничего не делал. Итак, как вы пишете гладкий игровой цикл для ncurses?

2 ответа

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

Вы, вероятно, только делаете вещи более трудными для себя, используя потоки. Вместо этого вы можете использовать poll() для ожидания ввода или следующего события tick/schedule. Вы не получите высокую точность, высокое разрешение, которое обычно важно для игр. Но затем, используя ncurses, я не думаю, что вам нужно беспокоиться, даже если время составляет несколько миллисекунд. Вы все равно можете поддерживать его, вычисляя таймаут следующим образом:

next_tick = last_tick + TIME_INTERVAL
timeout = next_tick - now();

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


Я не думаю, что у ncurses есть то, что вам нужно. В Windows вы можете использовать GetAsyncKeyState для каждого интересующего вас ключа.

licensed under cc by-sa 3.0 with attribution.