Управление игрой Windows Console в режиме реального времени - PullRequest
1 голос
/ 19 июня 2010

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

Как запустить игровой движок и одновременно дождаться ввода?Очевидно, что cin или scanf для меня бесполезны.

Ответы [ 3 ]

2 голосов
/ 19 июня 2010

Вы ищете библиотеку, такую ​​как ncurses.

Многие Разбойники -подобные игры написаны с использованием ncurses или аналогичных.

1 голос
/ 19 июня 2010

Есть два способа сделать это:

Первый - запустить два потока;один ожидает ввода и обновляет состояние соответственно, в то время как другой запускает игру.

Другой (более распространенный в разработке игр) способ - написать игру как один большой цикл, который выполняется много раз в секунду, обновляя состояние игры.перерисовка экрана и проверка ввода.

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

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

Для повышения эффективности вы можете при желании заблокировать с тайм-аутом, говоря «подождите нажатия клавиши,но не более 300 миллисекунд ", чтобы вы могли продолжить цикл.

select() приходит на ум, но есть и другие способы ожидания или проверки ввода.

0 голосов
/ 19 июня 2010

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

В любом случае, если вы хотите пойти по консольному маршруту, если вы используете компилятор Microsoft, тогда у вас должно быть доступно kbhit() (через conio.h), котороеможет сказать вам, будет ли блокироваться вызов fgetc на stdin.

На самом деле следует упомянуть, что компилятор MinGW gcc 3.4.5 также поддерживает kbhit().

...