Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 在游戏开发中处理状态和状态变化的好技术是什么?_Design Patterns_Architecture_Language Agnostic_State Machine - Fatal编程技术网

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

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

我是一名经验丰富的游戏开发新手,我制作了一款相当简单但能正常工作的3D platformer游戏,我正在寻找使该架构更具可扩展性的方法

在游戏开发中处理状态的好方法是什么?
一种非常简单的方法是使用多个布尔值,如:

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重新生成自己,等等。。。但是它非常简单,也许可以帮助你。状态机通常是处理这类事情的方法,尽管像暂停游戏这样的事情可能更容易用一个简单的布尔值。谢谢你指出状态模式。当然,我是通过谷歌找到的,但我想知道它是否有更适合游戏开发的变体/扩展(因为它非常通用/简单)。我还对如何处理状态变化和重叠状态组感兴趣。