游戏编程结构 我已经用C++编程了一段时间,我对语法非常熟悉。我想用快板做纸牌游戏。我明白我需要为游戏逻辑所做的一切。让我困惑的是如何驾驶游戏。我对基于循环的应用程序有点陌生。我已经习惯了VB.Net中基于事件的编程。我只是不确定在没有很多“如果”和“嘘声”的情况下交换球员和举办“活动”的正确方式。同时现在我有一个布勒数组来检查哪张牌在使用中。我的游戏每次都会在整个布尔数组中迭代,我觉得很混乱。另外,如果我想从我的菜单循环转到我的设置循环,没有一个大的bool怎么办? 谢谢

游戏编程结构 我已经用C++编程了一段时间,我对语法非常熟悉。我想用快板做纸牌游戏。我明白我需要为游戏逻辑所做的一切。让我困惑的是如何驾驶游戏。我对基于循环的应用程序有点陌生。我已经习惯了VB.Net中基于事件的编程。我只是不确定在没有很多“如果”和“嘘声”的情况下交换球员和举办“活动”的正确方式。同时现在我有一个布勒数组来检查哪张牌在使用中。我的游戏每次都会在整个布尔数组中迭代,我觉得很混乱。另外,如果我想从我的菜单循环转到我的设置循环,没有一个大的bool怎么办? 谢谢,c++,C++,这是许多不同的问题。我的第一个建议是寻找类似游戏的在线源代码。如果您需要代码方面的帮助,请将其与问题一起发布 您很可能需要一组类似以下内容的ifs和循环: while(1){ initYourLevel(); while(levelNotOver){ //do things } } 然后这一切都取决于你想做什么,你的问题对我来说有点模糊。开始关注人们是如何做事的。有很多示例代码 希望这会有所帮助大多数游戏框架都提供了两种需要实现的方法(它们都在循环中调用): 更新 画

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

您很可能需要一组类似以下内容的ifs和循环:

while(1){
  initYourLevel();
  while(levelNotOver){
    //do things
  }
}
然后这一切都取决于你想做什么,你的问题对我来说有点模糊。开始关注人们是如何做事的。有很多示例代码


希望这会有所帮助

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

  • 更新
更新
是您应该放置所有这些内容的地方,这些内容应该检查用户输入、状态更改、间隔操作等。例如物理、按钮按下等。没有什么可以阻止您在此处处理事件(请看)

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

void Game::render() {
  this->table->render();
  this->cardsOnTable->render();
  this->hand->render();
  // ...
  flipBuffers();
}
您可以使用
场景
场景管理器
(可以是堆栈)解决菜单/设置菜单问题。因此,不要直接将逻辑放入
游戏
,而是将其放入
场景
。您还可以在管理器中推送/弹出场景

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
  }
}

如果你想从更高级的东西开始,你可以尝试存储“事件”当你进入游戏>::更新< /COD>方法-这就是VB如何确保你不能修改从另一个线程到UI线程的控件——但是我不认为这是你用C++做的事情。

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

游戏引擎是状态机(游戏中的状态、设置中的状态和子状态)的一个很好的例子——您可以通过条件分支等来完成所有操作,但如果它变得更大,您需要抽象,以免失去理智。
在C++中,基于多态性类(请参阅您最喜欢的C++模式书)、基于模板的()、……BR>,有不同的实现状态机的方法。 常见的是,当使用中心循环时,您将事件转发给某个处理程序(表示状态或子状态),该处理程序将执行适合当前情况的操作。需要改变行为(例如从游戏到选项)?关掉处理器

您还需要包装和抽象当前游戏状态-不需要在每个位置显式处理例如卡。用卡片或内部处理的玩家管理器等包装物品。

也可以使用C++的容器和算法,可以在“代码> STD中管理卡或玩家::MAP<代码> S或<代码> STD::设置< /COD>当您达到标准库的极限时,请查看boost。

什么是大bool<代码>长布尔?;)
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
  }
}