游戏编程结构

时间:2009-10-24 22:40:55

标签: c++

我现在用c ++编程了一下,我非常熟悉语法。我正在尝试使用Allegro制作纸牌游戏。我理解我需要为游戏逻辑做的一切,而不是。令我困惑的是如何驾驶游戏。我是基于循环的应用程序的新手。我习惯了VB .Net中基于事件的编程。我只是不确定正确的方式,例如转换球员和提高“事件”而没有很多ifs和bools。现在我还有一系列bool来检查哪张牌在玩。而且我的游戏每次遍历整个bool阵列,对我来说似乎很麻烦。另外,如果我想从我的菜单循环转到我的设置循环,那么如何在没有大爆炸的情况下完成这项工作? 感谢

4 个答案:

答案 0 :(得分:5)

大多数游戏框架提供了两种您需要实现的方法(两者都在循环中调用):

  • 更新
  • 绘制

Update是您应该放置所有内容的地方,应检查用户输入,状态更改,间隔操作等。例如,Physics,ButtonPressed等。没有什么可以阻止您在此处处理事件(看看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();
}

您可以使用ScenesSceneManager(可以是堆栈)解决您的Menu / SettingsMenu问题。因此,不要将逻辑直接放入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确保您可以'从另一个线程修改控件而不是UI线程 - 但我不认为这是你用C ++做的事情。

答案 1 :(得分:2)

一般来说,你可能想看一本关于编程习语和设计模式的书,这里已经讨论了其他问题。即使与游戏没有直接关系,他们也会帮助你。

游戏引擎是状态机的一个很好的例子(状态在游戏中,状态在设置和子状态) - 你可以用条件分支等完成所有这些,但如果它变得更大,不要失去理智你需要抽象 基于多态类(请参阅您最喜欢的c ++模式书),基于模板(boost.statechart),...等,有不同的方法在c ++中实现状态机。 常见的是,当使用中央循环时,您将事件转发到某个处理程序(表示状态或子状态),这些处理程序将执行适合当前情况的操作。需要改变行为(例如从游戏到选项)?切换处理程序。

你还想要包装和抽象当前的游戏状态 - 不需要明确处理例如每个地方都有卡片。把事情包起来,例如内部处理它的卡或玩家经理 还可以使用C ++免费提供的容器和算法,例如管理std::mapstd::set中的卡片或玩家。当你达到标准库的极限时,请查看boost。

答案 2 :(得分:0)

这些是许多不同的问题。我的第一个建议是寻找类似游戏的在线源代码。如果您需要有关代码的帮助,请将其与问题一起发布。

答案 3 :(得分:0)

你很可能需要有一堆ifs和loop这样的东西:

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

然后这一切都取决于你想要做什么,你的问题对我来说有点模糊。开始查看tutorials,了解人们如何做事。那里有很多示例代码!

希望有所帮助