2009-10-24 3 views
2

Я немного программировал на C++, и я очень хорошо знаком с синтаксисом. Я пытаюсь использовать Allegro для создания карточной игры. Я понимаю все, что нужно для логики игры, а что нет. Меня озадачивает то, как управлять игрой. Я вроде как новый для приложений на основе петли. Я привык к программированию на основе событий в VB .Net. Я просто не уверен в правильном способе, например, переключать игроков и поднимать «события» без большого количества ifs и bools. Также прямо сейчас у меня есть массив bool, чтобы проверить, какая карта находится в игре. И моя игра повторяется через весь массив bool каждый раз, и мне кажется, что это беспорядочно. Кроме того, если я хочу перейти из цикла меню в мой цикл настроек, как это делается без большого bool? ThanksСтруктура программирования игр

+1

Какой большой bool? 'long long bool'? ;) –

ответ

5

Большинство игровых структур обеспечивают два способа, которые необходимы для реализации (оба из них вызывается в цикле):

  • 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++.

0

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

0

Вы, скорее всего, нужно иметь кучу МФС и петли происходит что-то вроде этого:

while(1){ 
    initYourLevel(); 
    while(levelNotOver){ 
    //do things 
    } 
} 

Тогда все зависит от того, что вы пытаетесь сделать, и ваш вопрос вид размыто ко мне. Начните смотреть на tutorials, чтобы обернуть голову вокруг того, как люди делают что-то. Существует много примеров кода!

Надежда, что помогает

2

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

Game-Engines - отличный пример государственных машин (состояние в игре, состояние в настройках и под-состояниях) - вы можете делать все это с условным разветвлением и т. Д., но чтобы не потерять голову, если она становится больше, вам нужно абстрагироваться.
Существуют различные подходы к реализации государственных машин в C++, основанных на полиморфных классах (см. Вашу любимую книгу шаблонов C++), на основе шаблона (boost.statechart), ...
Что общего, при использовании центрального цикла вы пересылаете события для некоторого обработчика (представляющего состояния или подстанции), который будет делать то, что подходит в текущей ситуации. Необходимо изменить поведение (например, от игры до опций)? Выключите обработчики.

Вы также захотите обернуть и отвлечь текущее состояние игры - нет необходимости в явной обработке, например. карт в любом месте. Оберните вещи, например. управляющий картой или игроком, который внутренне обрабатывает его.
Также используйте контейнеры и алгоритмы, которые C++ дает вам бесплатно, вы можете, например, управлять карточками или игроками в std::map s или std::set s. Когда вы попадаете в пределы стандартной библиотеки, проверьте повышение.