Design patterns 在游戏开发中处理状态和状态变化的好技术是什么?
我是一名经验丰富的游戏开发新手,我制作了一款相当简单但能正常工作的3D platformer游戏,我正在寻找使该架构更具可扩展性的方法 在游戏开发中处理状态的好方法是什么?Design patterns 在游戏开发中处理状态和状态变化的好技术是什么?,design-patterns,architecture,language-agnostic,state-machine,Design Patterns,Architecture,Language Agnostic,State Machine,我是一名经验丰富的游戏开发新手,我制作了一款相当简单但能正常工作的3D platformer游戏,我正在寻找使该架构更具可扩展性的方法 在游戏开发中处理状态的好方法是什么? 一种非常简单的方法是使用多个布尔值,如: time_stopped = True time_slow_motion = False level_loaded = True level_paused = True level_completed = False 这是非常不灵活的,因为开发人员错误可能同时导致time\u st
一种非常简单的方法是使用多个布尔值,如:
time_stopped = True
time_slow_motion = False
level_loaded = True
level_paused = True
level_completed = False
这是非常不灵活的,因为开发人员错误可能同时导致time\u stopped=True
和time\u slow\u 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
,它具有已加载
、暂停
和已完成
状态。但是我如何处理重叠的组,比如当LevelState
和TimeState
PAUSED
应该始终相同时?
关于如何解决状态管理问题,是否有一个好的设计模式或好的实践
处理状态更改的好方法是什么?我的想法是要么给state对象(例如,
LevelState
回调函数)来执行任何给定的状态更改,要么在每个游戏循环中轮询state对象,比如if level\u state.changedTo()==LevelState.COMPLETED:doStuff()
。有没有更好的方法来处理这个问题?消息队列/事件?我不想在状态对象中嵌入逻辑。我还感兴趣的是,一个人是否应该同时处理
changedFrom
和changedTo
事件,以及如果changedFrom
触发的逻辑在changedTo
逻辑触发之前改变对象的状态会发生什么情况-谁赢
我不想要特定于实现/语言的答案,但想要从架构角度思考的好方法的提示。这是一件非常常见的事情,甚至有一种模式:
一开始,这种方法似乎有一些开销,但随着逻辑变得越来越复杂,您将看到好处。使用python set()和make set,您可以将逻辑建立在set.issubset()等基础上。。。另外,我相信你想利用观察者pattern@pyInTheSky感谢您指出观察者模式!我知道用python编写代码的有效方法(尽管当前的游戏是用C#),但我尝试过让示例比Fastics更可读如果你只需要一个简单的状态机,我就在活动状态上发布了这篇文章:::我已经修改了它,但没有重新发布,你可以轻松地切换它以返回元组,并拥有一个充当仲裁器的run()函数,所以它不会建立一个巨大的调用堆栈。还有一些其他的MOD我还没有上传,比如如果你添加了一个状态,要求sm重新生成自己,等等。。。但是它非常简单,也许可以帮助你。状态机通常是处理这类事情的方法,尽管像暂停游戏这样的事情可能更容易用一个简单的布尔值。谢谢你指出状态模式。当然,我是通过谷歌找到的,但我想知道它是否有更适合游戏开发的变体/扩展(因为它非常通用/简单)。我还对如何处理状态变化和重叠状态组感兴趣。