【发布时间】:2016-11-05 12:17:08
【问题描述】:
我已经用 javascript 编写了一个组件实体系统有一段时间了,但我一直回到一个根本问题。
您如何处理特定实体(即单个实例或单个类型)的功能?
这是目前的情况:
我构建事物的方式是,当一个物品实体被另一个实体存储在库存中时,它不会被销毁,只是剥离了它的大部分组件。这样一来,如果它被丢弃,或者可能被取回以供使用,它可以以其旧状态重新激活。剥离的组件存储在附加到实体的 InstanceDataComponent 中(这只是一个 JSON 对象)。
有一个小型系统用于管理是否可以拾取物品的内部结构,并为所存储的东西添加带有哈希、数量和 id 的库存记录,但需要管理该实体从其“item”状态到“stored”状态。 应该怎么做?在我看来,要删除的组件和要更改的数据的详细信息对于每个项目都需要几乎是唯一的。
假设将来我想要一个实体在两种行为之间动态切换。例如,来回踱步直到它受到干扰,然后寻路找到玩家。什么会处理这种转变?
我觉得我对这里的问题和典型架构存在根本性的误解。什么是处理这个问题的干净方法?我是否应该为每组行为转换添加一个组件?最终不会有太多组件被美化为回调包装器吗?或者我是否遗漏了一些关于实体存储在库存中时应该如何更改的内容?
对可能正在经历这种情况的其他人的一些想法。
我当前的解决方案(经过多次迭代)是触发一个全局事件,例如itemPickupSystem:storedItem 并且实体可以为其工厂方法内的任何事件附加处理程序。由于多种原因,这是不可扩展的。我一直在考虑将这些事件移到队列中以便稍后执行。
我的工厂方法已经变成了回调定义的大杂烩,事情正在退化为回调地狱。另外,这个赛事系统不得不去,它是整个系统中唯一打破了游戏循环的串行性的部分。到目前为止,每个系统都以定义的顺序触发,所有逻辑都驻留在这些系统中。现在我不能保证实体会处于特定状态,因为这些回调可能在不同的时间点被触发。最后,由于执行被全权委托给不属于核心功能一部分的代码,因此无法知道触发事件时调用堆栈的大小。
【问题讨论】:
标签: javascript frameworks entity components game-engine