Реализация движения шара в игре Понг в реальном времени
пишу игру Понг на Си с помощью pdcurses, шарик двигается только тогда когда проходит цикл do-while, в котором проходят все вычисления и отрисовка в консоли, и получается что есть зависимость движения от ввода игрока, и игра в реальном времени превратилась в пошаговый Понг.
Сначала я подумал что нужно использовать многопоточность, но потом прикинул, что во времена изобретения этих игр, многоядерности не было и в помине. Потом наткнулся на реализацию без многопоточности, где можно возвращаться к нужной части кода, через некий маркер. Интересная абстракция, сам не догадался.
short int state = 0;
while(true){
if (state==0){
/* code */
}
else if (state==1){
/* code */
}
Далее написал что в первом if-while проходит движение шарика с использованием usleep для изменения его скорости. Но появилась новая проблема, нет возможности выхода из цикла кроме как опять же использованием getch(), то есть опять же зависимость движения от ввода игрока.
Проблема в том что у меня нет знаний, идей, etc. для реализации движения шарика в реальном времени. Либо искать новый подход, либо найти способ выхода из первого цикла. Смотреть реализацию на Ютубе не хочу, буду решать пока сам не напишу. Ниже скинул код для того чтобы видеть структуру кода, вся "физика" движения еще не полностью и верно прописана https://pastebin.com/PV9jeJgD - что было https://pastebin.com/9eN7tBmt - что есть сейчас. От идеала далеко, я и не прошу исправлять код, а только дать направление для копания.
Ответы (1 шт):
Ваша проблема в том, что getch()
зависает и ждет нажатия клавиши.
Гугл подсказывает, что достаточно перед его вызовом проверять _kbhit()
:
#include <chrono>
#include <iostream>
#include <thread>
#include <conio.h>
int main()
{
while (true)
{
if (_kbhit())
std::cout << _getch() << '\n'; // Это срабатывает только при нажатии.
std::cout << "."; // Это выполняется постоянно.
std::this_thread::sleep_for(std::chrono::milliseconds(16));
}
}