我用c++编程已经有一段时间了,我非常熟悉它的语法。我正试着用快板做一个纸牌游戏。我明白我需要为游戏逻辑所做的一切,以及什么不是。让我困惑的是如何驾驶这款游戏。我是一个基于循环的应用程序的新手。我习惯了在VB .Net中进行基于事件的编程。我只是不确定正确的方式,例如,交换球员和提高“事件”,而没有太多的如果和布尔值。另外,现在我有一个bool数组来检查哪张牌在玩。我的游戏每次都会遍历整个bool数组,这对我来说似乎很混乱。另外,如果我想从我的菜单循环转到我的设置循环,没有大的布尔值该怎么做呢?谢谢
发布于 2009-10-25 07:23:09
大多数游戏框架提供了两个需要实现的方法(这两个方法都是在循环中调用的):
Update是你应该放置所有东西的地方,它应该检查用户输入,状态变化,交互操作等。例如,物理,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();
}您可以使用Scenes和SceneManager (可以是堆栈)来解决菜单/设置菜单问题。因此,您可以将逻辑放入Scenes,而不是直接将逻辑放入Game。您可以将场景推送到管理器,也可以从管理器推送/弹出场景。
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++来做的事情。
发布于 2009-10-25 07:23:52
一般来说,你可能想看一本关于编程习惯用法和设计模式的书,这些已经在其他问题中讨论过了。即使与游戏没有直接关系,它们也会对你有所帮助。
游戏引擎是状态机的一个很好的例子(游戏中的状态,设置中的状态和子状态)-你可以通过条件分支等来完成所有的事情,但如果它变得更大,你需要进行抽象,以避免失去理智。
在c++中实现状态机有不同的方法,基于多态类(请参考您最喜欢的c++模式书籍)、基于模板(boost.statechart)、...
常见的是,当使用中心循环时,您将事件转发到某个处理程序(表示状态或子状态),该处理程序将执行适合当前情况的操作。需要改变行为(例如从游戏到选项)?切换处理程序。
你也会想要包装和抽象当前的游戏状态--不需要显式地处理每个地方的卡片。例如,把事情包装在一张卡片里--或者一个内部处理它的球员经理里。
还可以使用C++免费提供的容器和算法,例如,可以在std::maps或std::sets中管理卡片或玩家。当您达到标准库的限制时,请检查boost。
发布于 2009-10-25 07:01:03
这些是许多不同的问题。我的第一个建议是寻找类似游戏的在线源代码。如果您需要代码方面的帮助,请将其与问题一起发布。
https://stackoverflow.com/questions/1619392
复制相似问题