【问题标题】:What are good techniques to handle state and state change in game development?在游戏开发中处理状态和状态变化的好技术是什么?
【发布时间】: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 = 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 逻辑之前更改对象的状态会发生什么@ 逻辑 - 谁赢了?

我不想要特定于实现/语言的答案,而是关于从架构上明智地思考的好方法的提示。

【问题讨论】:

  • 使用 python set() 并制作集合,您可以将您的逻辑基于 set.issubset() 等...另外,我相信您想利用观察者模式
  • @pyInTheSky 感谢您指出观察者模式!我知道在 python 中编写代码的有效方法(尽管当前游戏是用 C# 编写的),但试图使示例比快速更具可读性
  • 如果你只想要一个简单的状态机,我在活动状态下发布了这个:code.activestate.com/recipes/… :: 我已经修改但没有重新发布,你可以轻松切换它以返回一个元组并运行() 函数充当仲裁器,因此它不会建立一个巨大的调用堆栈。还有一些其他的模组我没有上传,比如如果你添加一个状态,让sm重新生成等等......但它很简单,也许可以帮助你
  • 状态机通常是处理这类事情的方法,尽管像暂停游戏这样的事情可能只需要一个简单的布尔值就更容易了。

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


【解决方案1】:

这种事情太常见了,甚至还有一种模式:The State Pattern

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

【讨论】:

  • 感谢您指出状态模式。当然我是通过谷歌找到的,但我想知道它是否有更好的匹配游戏开发的变体/扩展(因为它非常通用/简单)。我也对如何处理状态变化和重叠状态组感兴趣。
猜你喜欢
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2011-05-31
  • 2016-03-04
  • 2018-08-14
相关资源
最近更新 更多