【发布时间】:2011-09-07 18:09:03
【问题描述】:
我是一位经验丰富的游戏开发新手,我制作了一款相当简单但可以运行的 3D 平台游戏,并且正在寻找使架构更具可扩展性的方法。
在游戏开发中处理状态的好方法是什么?
一种非常幼稚的方法是使用多个布尔值,例如:
time_stopped = True
time_slow_motion = False
level_loaded = True
level_paused = True
level_completed = False
这是非常不灵活的,因为开发者错误可能会同时导致time_stopped = True 和time_slow_motion = True,这会破坏游戏逻辑。
我正在寻找更好的方法:
class TimeState:
STOPPED = 0
SLOW_MOTION = 1
NORMAL = 2
current_state = 0
def isStopped(self):
if current_state == self.STOPPED: return True
但是我该如何以一种好的方式处理多组状态呢?我可以创建一个LevelState,它有LOADED、PAUSED 和COMPLETED 状态。但是我该如何处理重叠组,例如 LevelState 和 TimeState PAUSED 应该始终相同?
关于如何解决状态管理,有没有好的设计模式或好的实践?
什么是处理状态变化的好方法?
我的想法是要么给出状态对象,例如。 LevelState 回调函数可在任何给定状态更改时执行 - 或在每个游戏循环中轮询状态对象,如 if level_state.changedTo() == LevelState.COMPLETED: doStuff()。有没有更好的方法来处理这个问题?消息队列/事件?我不想将逻辑嵌入到状态对象中。
我还对是否应该同时处理changedFrom 和changedTo 事件感兴趣,如果changedFrom 触发的逻辑在触发changedTo 逻辑之前更改对象的状态会发生什么@ 逻辑 - 谁赢了?
我不想要特定于实现/语言的答案,而是关于从架构上明智地思考的好方法的提示。
【问题讨论】:
-
使用 python set() 并制作集合,您可以将您的逻辑基于 set.issubset() 等...另外,我相信您想利用观察者模式
-
@pyInTheSky 感谢您指出观察者模式!我知道在 python 中编写代码的有效方法(尽管当前游戏是用 C# 编写的),但试图使示例比快速更具可读性
-
如果你只想要一个简单的状态机,我在活动状态下发布了这个:code.activestate.com/recipes/… :: 我已经修改但没有重新发布,你可以轻松切换它以返回一个元组并运行() 函数充当仲裁器,因此它不会建立一个巨大的调用堆栈。还有一些其他的模组我没有上传,比如如果你添加一个状态,让sm重新生成等等......但它很简单,也许可以帮助你
-
状态机通常是处理这类事情的方法,尽管像暂停游戏这样的事情可能只需要一个简单的布尔值就更容易了。
标签: design-patterns architecture language-agnostic state-machine