Я сделал что-то похожее на игру, вы перемещаете своего персонажа (черный ящик) вверх и вниз, и есть стена с некоторой пробелой в середине, эта стена находится справа, она идет справа налево, и если вы дотронетесь до настенная игра заканчивается.
Я получаю нажатия клавиш в цикле, как;
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 (). Он печатает его так, как я хочу, но я не могу нажать клавишу, потому что эта стена () петли навсегда.
Игра выглядит так:
*
*
*
*
*
■
*
*
*
*
*
Я жду ваших ответов, спасибо!
Для всего, что близко к игре или симуляции, вам нужно узнать, что такое «игровой цикл», также называемый «основной цикл». Есть хороший объяснение принципа в википедии.
В принципе Вы не должны ждать ввода, но вы должны выполнить цикл, чтобы обновить состояние игры, даже если ничего не происходит: наблюдайте за вводом, смотрите, если что-то произошло, и если нет, просто продолжайте цикл, если что-то случится, сделайте это, затем продолжите цикл.
Вы никогда не должны ждать ввода, вы просто проверяете, есть ли что-то делать или нет.
Это также означает, что вы не должны использовать блокирующий вызов, такой как _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
}
Это очень наивно и не очень хорошо работает в реальном случае, но это в основном идея.
Я рекомендую прочитать этот а также этот чтобы лучше понять, что такое игровой цикл, но он не фокусируется на получении информации.
Если вы программируете в Windows, взгляните на _kbhit()
, Вы можете найти страницу MSDN для _kbhit()
Вот.
Хотя _kbhit()
исторически была функция MS-DOS (и позже, Windows) (это определено в <conio.h>
в системах Windows), вы можете развернуть свою собственную версию в Linux, как показано Вот а также Вот.
Тем не менее, более простым путем может быть использование ncurses
библиотека повернуть getch()
в неблокирующий вызов, позвонив nodelay(stdscreen, TRUE)
, как показано Вот а также Вот.