我想使用有限状态机来处理Entity游戏中的状态。具体来说,就本文而言,我将指代Player实体。
我Player将有空闲、跑步、跳跃、下降等状态……并且需要某种方式来管理这些状态以及它们之间的转换。在 OOP 环境中,最简单的解决方案是让每个状态成为自己的类,并使用一个名为handleInput接收输入的方法来确定是否应该发生状态更改。例如,在IdleState发生 move_right 或 move_left 时,状态将更改为新的RunningState。这很容易也很有意义,因为状态的行为应该封装在状态中。
但是,当您在实体组件系统中使用 FSM 时,一切都会发生变化。状态不再是对象(因为这会违背组件系统的灵活性),而是组件的不同排列。在JumpState可能有组件,如JumpComponent,AirbornMovementComponent等...而AttackState可能拥有的组件表示类似的攻击SwingComponent,DamageComponent,SwordComponent,等...的想法是通过重新排列组件,可以创建新的状态。系统的工作是简单地分别处理这些组件,因为系统不关心状态,它们只关心单个组件。实际的 FSM 位于FSMComponent实体持有的a 中。
这很有意义,除了处理状态转换时。现在我有一个InputSystem查找具有 aInputComponent和 a 的实体,FSMComponent并尝试根据当前输入更新 FSM 的状态。然而,这并不奏效。
FSM 处理输入的最佳方式(在我看来)是让每个状态决定它想要如何处理输入以及如何基于该输入转换到新状态。这可以追溯到实现 FSM 的 OOP 方式,这与 ECS 的设计背道而驰,其中组件只是数据包,而系统则负责所有逻辑。在 ECS 中,想法是让系统处理状态转换,但这会变得复杂,因为每个 FSM 可能有不同的状态转换条件。
您不能简单地在InputSystem“如果输入向右移动,则将状态设置为运行”中进行陈述。这将特定于玩家,但可能不适用于所有实体。如果有一天我决定让敌人可控,那么对 a 起作用的输入Player将与对Enemy.
我的问题:如何让我的 …
我正在加载一个包含一堆 unicode 字符的文件(例如\xe9\x87\x8b)。我想在 Python 中将这些字符转换为其转义 unicode 形式 ( \u91cb)。我在 StackOverflow 上发现了几个类似的问题,包括Evaluate UTF-8 Literal escape strings in a string in Python3,它几乎完全符合我的要求,但我不知道如何保存数据。
例如: 输入文件:
\xe9\x87\x8b
Python脚本
file = open("input.txt", "r")
text = file.read()
file.close()
encoded = text.encode().decode('unicode-escape').encode('latin1').decode('utf-8')
file = open("output.txt", "w")
file.write(encoded) # fails with a unicode exception
file.close()
Run Code Online (Sandbox Code Playgroud)
输出文件(我想要的):
\u91cb