我现在用c ++编程了一下,我非常熟悉语法。我正在尝试使用Allegro制作纸牌游戏。我理解我需要为游戏逻辑做的一切,而不是。令我困惑的是如何驾驶游戏。我是基于循环的应用程序的新手。我习惯了VB .Net中基于事件的编程。我只是不确定正确的方式,例如转换球员和提高“事件”而没有很多ifs和bools。现在我还有一系列bool来检查哪张牌在玩。而且我的游戏每次遍历整个bool阵列,对我来说似乎很麻烦。另外,如果我想从我的菜单循环转到我的设置循环,那么如何在没有大爆炸的情况下完成这项工作? 感谢
答案 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();
}
您可以使用Scenes
和SceneManager
(可以是堆栈)解决您的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::map
或std::set
中的卡片或玩家。当你达到标准库的极限时,请查看boost。
答案 2 :(得分:0)
这些是许多不同的问题。我的第一个建议是寻找类似游戏的在线源代码。如果您需要有关代码的帮助,请将其与问题一起发布。
答案 3 :(得分:0)
你很可能需要有一堆ifs和loop这样的东西:
while(1){
initYourLevel();
while(levelNotOver){
//do things
}
}
然后这一切都取决于你想要做什么,你的问题对我来说有点模糊。开始查看tutorials,了解人们如何做事。那里有很多示例代码!
希望有所帮助