C ++ Game — Loop и KeyPress одновременно

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

Я получаю нажатия клавиш в цикле, как;

while(keyboardInput=getKeyPress()){
switch(keyboardInput){/*checks the key and goes up or down*/}
//draws the main character, then also draws the wall.
}

и я сделал функцию wall (), она печатает блоки для создания стены.

Проблема в том, что стена движется только после нажатия клавиши моя функция нажатия клавиш работает с _getch ()

То, что я хочу видеть, это то, что стена всегда будет двигаться, как каждую секунду, влево, даже если пользователь не нажимает какую-либо клавишу, и нажатие / перемещение клавиши будет работать одинаково.

Я вставил функцию wall () в функцию wall (). Он печатает его так, как я хочу, но я не могу нажать клавишу, потому что эта стена () петли навсегда.

Игра выглядит так:

                                    *
*
*
*
*

■

*
*
*
*
*

Я жду ваших ответов, спасибо!

2

Решение

Для всего, что близко к игре или симуляции, вам нужно узнать, что такое «игровой цикл», также называемый «основной цикл». Есть хороший объяснение принципа в википедии.

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

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

Простой (или, точнее, наивный) игровой цикл выглядит так:

while( !exit_game )
{
read_input(); // acquire inputs then generate actions interpreted from inputs, if any
update_game(); // update the game to generate it's new state after applying all the actions from all the game entities
render(); // render the graphics and audio
}

Это очень наивно и не очень хорошо работает в реальном случае, но это в основном идея.

Я рекомендую прочитать этот а также этот чтобы лучше понять, что такое игровой цикл, но он не фокусируется на получении информации.

3

Другие решения

Если вы программируете в Windows, взгляните на _kbhit(), Вы можете найти страницу MSDN для _kbhit() Вот.

Хотя _kbhit() исторически была функция MS-DOS (и позже, Windows) (это определено в <conio.h> в системах Windows), вы можете развернуть свою собственную версию в Linux, как показано Вот а также Вот.

Тем не менее, более простым путем может быть использование ncurses библиотека повернуть getch() в неблокирующий вызов, позвонив nodelay(stdscreen, TRUE), как показано Вот а также Вот.

1

По вопросам рекламы [email protected]