我正在为我正在开发的游戏中的战术 spaceship 战斗编写原型(prototype)。
我现在正在处理的部分的基本思想是“船”对象(代表单个单独的船)包含一个“系统”对象列表。当一艘船首次初始化时,它会在其每个系统上调用一个 initialize()
函数(这与标准的 __init__
函数不同对象)将(除其他外)在系统所属的船上调用 register()
函数。
那个register()
函数接受一个字符串作为参数,它是系统希望在ship 对象上调用的函数的名称。每当在 ship 对象上调用该函数时,ship 对象将在所有注册接收它的系统上调用它,直到其中一个返回 True(表示系统以最终方式“处理”该操作)或它运行在已注册接收调用的系统中。到目前为止一切顺利。
但是,某些系统可能希望在其他系统之前获得它们的调用。例如,您的船体系统将希望成为最后一个接收 hit()
的系统;盾牌会想先听到它。最简单的解决方案可能是实现优先级系统:护盾将调用 myship.register("hit",priority=1)
,船体将调用 myship.register("hit",优先级=0)
.
但现在我们想象应该有“ super 护盾”在主护盾承受攻击之前拦截攻击。很简单:给他们优先级 2。如果很多系统都想接受某个请求,这可能会让开发人员感到恼火,但他可以管理它。
但是,该游戏的目的是让用户可以高度扩展。如果有人发布了一个插件(举个愚蠢的例子)每次玩家的船被击中时播放全金属外壳声音片段,该插件的开发者可能不知道添加“ super 护盾”的插件,并给出他的Annoying Drill Sergeant 系统的优先级与 super 护盾相同或更低,因此在 super 护盾确认之前可能不会收到命中消息。这当然是不受欢迎的行为。
有没有人知道如何避免这个问题?
其他人建议有一种方法,系统可以请求比当前最高/最低优先级更高或更低的优先级,但这会导致很大程度上未定义的行为,因为优先级将基于优先级的顺序系统已初始化。
我还考虑过添加一个“ super 优先级”,其中一个系统总是在其他系统之前收到消息,但无法确认和停止它。不过,这只是部分解决方案;它会修复给定的示例,但不会修复需要阻止消息的 super 屏蔽层下的 super 屏蔽层的情况。
最佳答案
问题是试图给优先级一个绝对值。相反,您需要为每个调用构建一个相对优先级数据结构。这样你就可以说 hit() 是 super 护盾的最高优先级,然后是护盾,然后是船体。然后,模组只需更改船体的击中音效或添加额外的音效即可播放。
最直接的方法是要求将给定调用的任何新对象的优先级链接到具有该调用的另一个对象。然后它需要选择新对象的优先级是低还是高。所以盾牌和船体是相连的(船体 < 盾牌), super 盾牌和盾牌是相连的(盾牌 < super 盾牌)。该信息将使构建一个 2D 多个项目(2D 允许相同的优先级)链表变得相当容易,该链表保存每个调用的优先级。因此 register 函数可能看起来像这样,“myship.register("hit",shields,"lower",super-shields)"并赋予盾牌比 super 盾牌更低的优先级。如果您已经有了船体和 super 盾牌,并且想在它们之间添加盾牌,则可以考虑其他条件,例如 myship.register("hit",hull,"lower",shields,"lower",super-shields) .但是,您将面临不得不处理矛盾或违反条件的风险。
关于宇宙飞船上接收消息的系统的算法设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22438569/