首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏编程结构

游戏编程结构
EN

Stack Overflow用户
提问于 2009-10-25 06:40:55
回答 4查看 5K关注 0票数 2

我用c++编程已经有一段时间了,我非常熟悉它的语法。我正试着用快板做一个纸牌游戏。我明白我需要为游戏逻辑所做的一切,以及什么不是。让我困惑的是如何驾驶这款游戏。我是一个基于循环的应用程序的新手。我习惯了在VB .Net中进行基于事件的编程。我只是不确定正确的方式,例如,交换球员和提高“事件”,而没有太多的如果和布尔值。另外,现在我有一个bool数组来检查哪张牌在玩。我的游戏每次都会遍历整个bool数组,这对我来说似乎很混乱。另外,如果我想从我的菜单循环转到我的设置循环,没有大的布尔值该怎么做呢?谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-25 07:23:09

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

  • Update
  • Draw

Update是你应该放置所有东西的地方,它应该检查用户输入,状态变化,交互操作等。例如,物理,ButtonPressed等。没有什么能阻止你在这里处理事件(看看BoostLibrary Signals)。

代码语言:javascript
复制
void Game::update() {
   if(pushedButton) {
       this->cardsOnTable->add(this->hand->remove(0));
       this->activePlayer = nextPlayer();
   }
}

Draw应该只在屏幕上呈现当前的底层状态。因此,您必须确保您的底层状态/模型易于访问。

代码语言:javascript
复制
void Game::render() {
  this->table->render();
  this->cardsOnTable->render();
  this->hand->render();
  // ...
  flipBuffers();
}

您可以使用ScenesSceneManager (可以是堆栈)来解决菜单/设置菜单问题。因此,您可以将逻辑放入Scenes,而不是直接将逻辑放入Game。您可以将场景推送到管理器,也可以从管理器推送/弹出场景。

代码语言:javascript
复制
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++来做的事情。

票数 5
EN

Stack Overflow用户

发布于 2009-10-25 07:23:52

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

游戏引擎是状态机的一个很好的例子(游戏中的状态,设置中的状态和子状态)-你可以通过条件分支等来完成所有的事情,但如果它变得更大,你需要进行抽象,以避免失去理智。

在c++中实现状态机有不同的方法,基于多态类(请参考您最喜欢的c++模式书籍)、基于模板(boost.statechart)、...

常见的是,当使用中心循环时,您将事件转发到某个处理程序(表示状态或子状态),该处理程序将执行适合当前情况的操作。需要改变行为(例如从游戏到选项)?切换处理程序。

你也会想要包装和抽象当前的游戏状态--不需要显式地处理每个地方的卡片。例如,把事情包装在一张卡片里--或者一个内部处理它的球员经理里。

还可以使用C++免费提供的容器和算法,例如,可以在std::maps或std::sets中管理卡片或玩家。当您达到标准库的限制时,请检查boost。

票数 2
EN

Stack Overflow用户

发布于 2009-10-25 07:01:03

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1619392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档