Приостановка игры внутри игрового цикла

12

Внутри игрового цикла игра приостанавливается нажатием P, что означает, что игровой цикл больше не запускается. Проблема в том, что после того, как этот цикл остановлен, P не может быть нажата снова, чтобы возобновить цикл, так как он был внутри самого цикла. Как сделать так, чтобы при повторном нажатии P цикл снова работал?

GSquadron
источник

Ответы:

20

Не останавливайте игровой цикл при приостановке игры. Вместо этого вы должны добавить переменную bool, которая изменяется на true / false в зависимости от того, приостановлена ​​ли игра. Если игра приостановлена, вам нужно только прекратить обновление игры, но вы все равно можете продолжать рендеринг текущего кадра, включая получение обновлений из ввода.

if(gameIsPaused == false)
{
    // run updates
}
checkInput();
render();
Кату
источник
Возможно, вы захотите использовать разные checkInputфункции для режима паузы и режима без паузы, потому что могут быть некоторые элементы управления, которые доступны только в одном режиме или другом. checkInputФункция режим паузы не может сделать ничего более , чем смотреть , если Pнажата , а затем установить gameIsPaused = false, но некоторые игры также размещать дополнительно функции на экране паузы (в 90 - х годах он был популярен , чтобы иметь экран паузы , как скрытый вход для читов, современный игры любят сочетать его с экраном меню).
Филипп
1
Хотя в целом я бы согласился с вашим ответом, я думаю, что следует четко указать, что иногда вполне допустимо запускать некоторые обновления в состоянии паузы. Например, анимация пунктов меню или, возможно, управление аудио. Основная идея заключается в том, что условие паузы позволяет вам переходить в другой набор checkInput/ render/ updateвызовов.
Николас Миллер
Единственное, что должно изменить игру, - это то, что бит "мира обновления" должен быть пропущен. Все остальные функциональные возможности, вероятно, должны оставаться как обычно.
Mooing Duck
4
Я старался сделать ответ как можно более простым, потому что это очень простые вещи в программировании игр, и я не хотел запутывать спрашивающего.
Кату
1
@ user3730788: Ветвь, которая выполняется один раз за игровой цикл (то есть менее 100 раз в секунду), не окажет заметного влияния на производительность, даже если она ошибочно прогнозируется каждый раз .
Ильмари Каронен,
1

Сделайте так, чтобы нажатие кнопки P переключало на другой цикл, который обрабатывает игровое состояние «Приостановлено» и позволяет вернуться к исходному циклу игры, нажав кнопку P еще раз.

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

Хаф
источник