Я немного программировал на C++, и я очень хорошо знаком с синтаксисом. Я пытаюсь использовать Allegro для создания карточной игры. Я понимаю все, что нужно для логики игры, а что нет. Меня озадачивает то, как управлять игрой. Я вроде как новый для приложений на основе петли. Я привык к программированию на основе событий в VB .Net. Я просто не уверен в правильном способе, например, переключать игроков и поднимать «события» без большого количества ifs и bools. Также прямо сейчас у меня есть массив bool, чтобы проверить, какая карта находится в игре. И моя игра повторяется через весь массив bool каждый раз, и мне кажется, что это беспорядочно. Кроме того, если я хочу перейти из цикла меню в мой цикл настроек, как это делается без большого bool? ThanksСтруктура программирования игр
ответ
Большинство игровых структур обеспечивают два способа, которые необходимы для реализации (оба из них вызывается в цикле):
- Update
- Draw
Update
- это то, где вы должны поместить все эти вещи, которые должны проверять вход пользователя, изменения состояния, промежуточные действия и т. Д. Примерами могут быть физика, Butto nPressed и т. д. Ничто не мешает вам работать с событиями здесь (см. BoostLibrary Signals).
void Game::update() {
if(pushedButton) {
this->cardsOnTable->add(this->hand->remove(0));
this->activePlayer = nextPlayer();
}
}
Draw
должен только оказывать ток, лежащий в основе состояния на экран. Поэтому вы должны убедиться, что ваше базовое состояние/модель легко получить доступ.
void Game::render() {
this->table->render();
this->cardsOnTable->render();
this->hand->render();
// ...
flipBuffers();
}
Вы можете решить Menu/меню Настройки проблемы с Scenes
и SceneManager
(который может быть Stack). Поэтому вместо того, чтобы напрямую вводить логику в Game
, вы помещаете ее в Scenes
. И вы можете нажать/поп-сцены в/из Менеджера.
void Game::update() {
this->sceneManager->activeScene->update();
}
void MenuScene::update() {
if(settingsMenuItemSelected) {
game->sceneManager->push(new SettingsMenuScene));
// now the next time Game::update() is called
// the active scene of the SceneManager will be
// the settings menu. And once it is closed/cancelled
// it will pop itself from the manager and we are back
// in the regular menu
}
}
Если вы хотите начать с более продвинутыми вещами, вы могли бы попытаться сохранить «событие» в огромный список и запустить все события при входе в методе Game::update
- это то, как VB убеждается, что вы можете» t изменять элементы управления из другого потока, кроме потока пользовательского интерфейса, но я не думаю, что это то, что вы сделали бы, используя C++.
Это много разных вопросов. Мои первые предложения состоят в том, чтобы искать онлайн-исходный код для подобных игр. Если вам нужна помощь с кодом, отправьте его вместе с вопросом.
Вы, скорее всего, нужно иметь кучу МФС и петли происходит что-то вроде этого:
while(1){
initYourLevel();
while(levelNotOver){
//do things
}
}
Тогда все зависит от того, что вы пытаетесь сделать, и ваш вопрос вид размыто ко мне. Начните смотреть на tutorials, чтобы обернуть голову вокруг того, как люди делают что-то. Существует много примеров кода!
Надежда, что помогает
В общем, вы можете ознакомиться с книгой о программировании идиом и шаблонов проектирования, которые уже обсуждаются здесь в других вопросах. Даже если они не связаны напрямую с играми, они вам помогут.
Game-Engines - отличный пример государственных машин (состояние в игре, состояние в настройках и под-состояниях) - вы можете делать все это с условным разветвлением и т. Д., но чтобы не потерять голову, если она становится больше, вам нужно абстрагироваться.
Существуют различные подходы к реализации государственных машин в C++, основанных на полиморфных классах (см. Вашу любимую книгу шаблонов C++), на основе шаблона (boost.statechart), ...
Что общего, при использовании центрального цикла вы пересылаете события для некоторого обработчика (представляющего состояния или подстанции), который будет делать то, что подходит в текущей ситуации. Необходимо изменить поведение (например, от игры до опций)? Выключите обработчики.
Вы также захотите обернуть и отвлечь текущее состояние игры - нет необходимости в явной обработке, например. карт в любом месте. Оберните вещи, например. управляющий картой или игроком, который внутренне обрабатывает его.
Также используйте контейнеры и алгоритмы, которые C++ дает вам бесплатно, вы можете, например, управлять карточками или игроками в std::map
s или std::set
s. Когда вы попадаете в пределы стандартной библиотеки, проверьте повышение.
Какой большой bool? 'long long bool'? ;) –