在游戏开发中处理状态和状态变化的好技术是什么?

时间:2011-09-07 18:09:03

标签: design-patterns architecture language-agnostic state-machine

我是一名经验丰富的游戏开发开发人员,我制作了一款相当简单但工作正常的3D平台游戏,并且正在寻找使这种架构更具可扩展性的方法。

在游戏开发中处理状态的好方法是什么?
一个非常天真的方法是有多个布尔值,如:

time_stopped = True
time_slow_motion = False
level_loaded = True
level_paused = True
level_completed = False

这是非常不灵活的,因为开发人员错误可能同时导致time_stopped = Truetime_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,其中包含LOADEDPAUSEDCOMPLETED个州。但是,如何处理重叠组,例如LevelStateTimeState PAUSED应该始终相同? 如何解决国家管理是否有良好的设计模式或良好实践?

处理状态变化的好方法是什么?
我的想法是要么给出状态对象,例如。 LevelState回调函数可以在任何给定的状态更改上执行 - 或者像if level_state.changedTo() == LevelState.COMPLETED: doStuff()那样轮询每个游戏循环的状态对象。有没有更好的方法来处理这个?消息队列/事件?我不想将逻辑嵌入到状态对象中 我也感兴趣的是,如果一个人应该处理changedFromchangedTo事件,如果changedFrom触发的逻辑在changedTo之前改变了对象的状态,会发生什么?逻辑被触发 - 谁赢了?

我不希望实现/语言特定的答案,但提示在架构上明智地思考的好方法。

1 个答案:

答案 0 :(得分:2)

这是一种常见的事情,甚至有一种模式:The State Pattern

一开始,似乎这种方法有一些开销,但随着逻辑变得越来越复杂,你会看到好处。