首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >飞船上信息接收系统的算法设计

飞船上信息接收系统的算法设计
EN

Stack Overflow用户
提问于 2014-03-16 23:06:29
回答 1查看 111关注 0票数 0

我正在为我正在开发的游戏中的战术宇宙飞船战斗写一个原型。

我现在正在做的这个部分的基本思想是,一个'ship‘对象(代表一个单独的船)包含一个'system’对象的列表。当船舶首次初始化时,它在其每个系统上调用一个initialize()函数(这与创建对象实例时调用的标准__init__函数不同),该函数将在系统所属的船舶上调用register()函数。

register()函数接受一个字符串作为参数,这是系统希望在ship对象上调用的函数的名称。每当在ship对象上调用该函数时,ship对象都会在注册接收该函数的所有系统上调用它,直到其中一个系统返回True (表示系统最终‘处理’了该操作),或者它耗尽了已注册接收该调用的系统。到目前一切尚好。

但是,一些系统可能希望在其他系统之前获得呼叫。例如,您的船体系统将希望成为最后一个接收hit()的系统;而防护罩将首先接收它。最简单的解决方案可能是实现一个优先级系统:屏蔽将调用myship.register("hit",priority=1),而外壳将调用myship.register("hit",priority=0)

但现在我们设想,应该有“超级护盾”在主护盾接受之前拦截撞击。很简单:给他们优先级2。如果一大堆系统想要处理某个请求,这可能会让开发人员感到恼火,但他可以管理它。

然而,这个游戏的目的是高度用户可扩展的。如果有人发布了一个插件(举个愚蠢的例子),在玩家的飞船被击中时播放完整的金属夹克声音片段,该插件的开发者可能不知道添加了“超级盾牌”的插件,并给他恼人的训练中士系统与超级盾牌相同或更低的优先级,因此在超级盾牌确认之前可能不会收到命中消息。当然,这是不受欢迎的行为。

有没有人有办法避免这个问题?

其他人建议有一种方法,系统可以请求比最高/最低当前优先级更高或更低的优先级,但这会导致很大程度上未定义的行为,因为优先级将基于系统初始化的顺序。

我还考虑添加一个“超级优先级”,即一个系统总是在其他系统之前收到消息,但不能确认和停止它。不过,这只是一个部分解决方案;它将修复给定的示例,但不存在需要阻止消息的超级-超级-屏蔽下的超级屏蔽的情况。

EN

回答 1

Stack Overflow用户

发布于 2014-03-17 18:36:06

问题是试图给优先级一个绝对值。相反,您需要为每个调用构建一个相对优先级的数据结构。这样,您可以说hit()对于超级盾牌是最高优先级的,然后是盾牌,然后是外壳。然后,mod只需要更改船体的命中音效,或者添加一个额外的音效来播放。

最直接的方法是要求给定调用的任何新对象的优先级都链接到具有该调用的另一个对象。然后,它需要选择新对象的优先级是更低还是更高。因此盾牌和船体是链接的(外壳<盾牌),超级盾牌和盾牌是链接的(盾牌<超级盾牌)。这些信息将使构建2D多项(2D以允许相同的优先级)链表变得相当容易,该链表保存每个呼叫的优先级。因此,寄存器函数可能看起来像这样,“myship.register(”命中“,屏蔽,”较低“,超级屏蔽)”,并赋予屏蔽比超级屏蔽更低的优先级。如果你已经有了船体和超级盾牌,并且想要在它们之间添加盾牌,你可以考虑其他条件,比如myship.register(“命中”,船体,“较低”,盾牌,“较低”,超级盾牌)。然而,你会冒着不得不处理矛盾或违反条件的风险。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22438569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档