多人射击游戏:弹丸应该携带有关损坏的信息,还是应该携带损坏的实体?
Multiplayer shooter: should projectiles carry the information about damage, or should the damaged entity?
这是一道概念题,所以没有代码。
在制作多人射击游戏时,无论是 2D 还是 3D,如果有基于射弹的武器,每个射弹是否应该包含关于谁发射它的信息,以及它应该造成多少伤害?或者,该实体是否应该在被射弹击中后,解释射弹并相应地对自己造成伤害?
基本上,问题是"where should the information/code about the damage being dealt exist."
想法?
恕我直言
完全取决于您认为的损害:
弹丸的潜在伤害……绝对存储在每个弹丸中。
对目标造成的伤害......一个计数器,用于增加不同射弹对其造成的所有伤害。
存储在弹丸上的关于发射实体的信息仅在发射实体因成功击中目标而获得分数时才相关。
就我个人而言,我认为给弹丸这种伤害提供了更好的模块化并且在逻辑上更有意义。
模块化
我曾经做过 M.U.G.E.N,这是一种格斗游戏引擎,个人创作者和创作者团队可以在其中发布完整游戏或游戏片段。完整的游戏实际上相对较少,仅次于您可以复制到您自己的文件夹并添加到您的名册中的单个角色、阶段等。因此,如果任何游戏引擎绝对必须为模块化设计,那就是它。
M.U.G.E.N 是如何处理这种情况的?除非在特定情况下,某个特定的创作者想要做一些有创意或非常规的事情,伤害量(以及更多的信息,如击中声音、眩晕多长时间、结果进入什么状态)由角色携带提供攻击(在射击游戏中,这相当于持有此信息的子弹)。为什么?
好吧,简而言之,无法定义一个角色,以便它可以分辨出是谁击中了它以及他们使用了何种攻击,甚至还没有 制作 还。请记住,1999 年的角色和 2016 年的角色可以毫无问题地互相战斗。几乎同样令人生畏(而且对你来说更重要),即使一个角色的创造者能够以某种方式预知每个角色和每一个将被添加的攻击,它也需要 long 时间和 很多 代码来为所有这些添加案例。
让我们回到射击游戏的概念上来。假设你有两种子弹。一个很大,造成很大的伤害(我们称之为 BigBullet),而另一个很小,造成的伤害很小(我们称之为 SmallBullet)。还要考虑这些子弹可以伤害的两种目标(我们称它们为士兵和坦克)。如果您将伤害信息存储在目标 classes(士兵和坦克)中,则必须为每种类型的目标的每种类型的子弹定义此信息。
也就是说,士兵 class 必须有逻辑来确定它是哪种类型的子弹以及它应该造成多少伤害。 Tank class 还必须有逻辑来确定它是哪种类型的子弹以及它应该造成多少伤害。如果您从公共基础 class 继承两个 classes,则可以减少此代码的冗余,正确。
但与备选方案相比。 BigBullet 和 SmallBullet 有 public 伤害范围。士兵和坦克不必关心它被什么类型的子弹击中;只问它应该造成多少伤害。所以您可以完全删除该代码。
更重要的是,这使设计易于扩展。如果您稍后决定想要一个造成更多伤害的新 HugeBullet class,您需要做的就是制作一个新的 HugeBullet class。您根本不必担心更新目标实体。
逻辑
这是比较主观的,但让我描述一下我的看法。
想想人类的头骨。这是一件艺术品。它有关节,可以让下巴运动。它在所有合适的地方都有孔,可以让感官信息进入,还有一个孔用于食物。它专为耐用性和观察性而设计。
但它并不是专门为可能发生的每一件事而设计的。它没有子弹偏转 属性 或斧头生存 属性。它具有有助于这些防御的属性,但只是在最模糊和最笼统的术语中。也许他们对穿刺有一般的抵抗力,但他们对每种类型的子弹的穿刺没有特别的抵抗力。
最终,它所受伤害的驱动力取决于击中它的武器的设计。子弹旨在切穿肉和骨头。所以组织你的代码,让子弹对象携带伤害数据是对现实更准确的模拟。
这是一道概念题,所以没有代码。
在制作多人射击游戏时,无论是 2D 还是 3D,如果有基于射弹的武器,每个射弹是否应该包含关于谁发射它的信息,以及它应该造成多少伤害?或者,该实体是否应该在被射弹击中后,解释射弹并相应地对自己造成伤害?
基本上,问题是"where should the information/code about the damage being dealt exist."
想法?
恕我直言 完全取决于您认为的损害: 弹丸的潜在伤害……绝对存储在每个弹丸中。 对目标造成的伤害......一个计数器,用于增加不同射弹对其造成的所有伤害。 存储在弹丸上的关于发射实体的信息仅在发射实体因成功击中目标而获得分数时才相关。
就我个人而言,我认为给弹丸这种伤害提供了更好的模块化并且在逻辑上更有意义。
模块化
我曾经做过 M.U.G.E.N,这是一种格斗游戏引擎,个人创作者和创作者团队可以在其中发布完整游戏或游戏片段。完整的游戏实际上相对较少,仅次于您可以复制到您自己的文件夹并添加到您的名册中的单个角色、阶段等。因此,如果任何游戏引擎绝对必须为模块化设计,那就是它。
M.U.G.E.N 是如何处理这种情况的?除非在特定情况下,某个特定的创作者想要做一些有创意或非常规的事情,伤害量(以及更多的信息,如击中声音、眩晕多长时间、结果进入什么状态)由角色携带提供攻击(在射击游戏中,这相当于持有此信息的子弹)。为什么?
好吧,简而言之,无法定义一个角色,以便它可以分辨出是谁击中了它以及他们使用了何种攻击,甚至还没有 制作 还。请记住,1999 年的角色和 2016 年的角色可以毫无问题地互相战斗。几乎同样令人生畏(而且对你来说更重要),即使一个角色的创造者能够以某种方式预知每个角色和每一个将被添加的攻击,它也需要 long 时间和 很多 代码来为所有这些添加案例。
让我们回到射击游戏的概念上来。假设你有两种子弹。一个很大,造成很大的伤害(我们称之为 BigBullet),而另一个很小,造成的伤害很小(我们称之为 SmallBullet)。还要考虑这些子弹可以伤害的两种目标(我们称它们为士兵和坦克)。如果您将伤害信息存储在目标 classes(士兵和坦克)中,则必须为每种类型的目标的每种类型的子弹定义此信息。
也就是说,士兵 class 必须有逻辑来确定它是哪种类型的子弹以及它应该造成多少伤害。 Tank class 还必须有逻辑来确定它是哪种类型的子弹以及它应该造成多少伤害。如果您从公共基础 class 继承两个 classes,则可以减少此代码的冗余,正确。
但与备选方案相比。 BigBullet 和 SmallBullet 有 public 伤害范围。士兵和坦克不必关心它被什么类型的子弹击中;只问它应该造成多少伤害。所以您可以完全删除该代码。
更重要的是,这使设计易于扩展。如果您稍后决定想要一个造成更多伤害的新 HugeBullet class,您需要做的就是制作一个新的 HugeBullet class。您根本不必担心更新目标实体。
逻辑
这是比较主观的,但让我描述一下我的看法。
想想人类的头骨。这是一件艺术品。它有关节,可以让下巴运动。它在所有合适的地方都有孔,可以让感官信息进入,还有一个孔用于食物。它专为耐用性和观察性而设计。
但它并不是专门为可能发生的每一件事而设计的。它没有子弹偏转 属性 或斧头生存 属性。它具有有助于这些防御的属性,但只是在最模糊和最笼统的术语中。也许他们对穿刺有一般的抵抗力,但他们对每种类型的子弹的穿刺没有特别的抵抗力。
最终,它所受伤害的驱动力取决于击中它的武器的设计。子弹旨在切穿肉和骨头。所以组织你的代码,让子弹对象携带伤害数据是对现实更准确的模拟。