在游戏中制作大量法术时遇到麻烦

本文关键字:遇到 麻烦 游戏 | 更新日期: 2023-09-27 18:36:37

所以我在想办法在我的

游戏中实现法术时遇到了麻烦。问题是我想添加许多不同的法术(如传送、心灵感应、火控等)。我尝试的第一件事是创建一个大的类层次结构,例如:

Spell -> Passive ->Speed
                 ->Flying
      -> Active ->Teleportation
                  Telekinesis

一开始看起来不错,但当我开始实施很多法术时,它开始变得混乱。

我搜索了其他解决方案,并找到了基于实体组件的系统。但我不认为这将是一个好的解决方案。那么你们中有人知道解决这个问题的其他方法吗?

在游戏中制作大量法术时遇到麻烦

如果你使用类似Strategy Design Pattern的东西,你在哪里有一个接口来定义一个方法,如ApplySpell(),也许是一个Name属性和实现所述接口的具体咒语怎么办?

这样,对于每个角色,您可以迭代其分配的咒语并使用 Name 属性获取名称(也许您想通过 UI 或类似的东西列出它们),或者将它们存储在字典中,其中咒语的名称是键,实际的拼写实现是值。

然后你可以做的是,一旦用户选择了咒语,你需要做的就是调用ApplySpell(),实际咒语的作用将委托给表示咒语的类。

这样,您无需担心需要调用哪个咒语,因为一切都是在幕后完成的。

继承

是可以的,但对于属性,您可以使用接口或基类作为属性:

class SpellBase
{
    public string Name { get; protected set; } // all spells have to have name
    public virtual void Animate() { ... } // abstract?
    ...
}

然后进行传送

class TeleportationSpell: SpellBase, IEffect
{
   ... // set name, override Animate() and implement IAreaEffect (as OnSelfEffect() for teleport)
}
interface IEffect
{
    public EffectBase Effect {get; set;}
    ...
}
class EffectBase { ... }
class OnSelfEffect: EffectBase { ... }
class OnTargetEffect: EffectBase { ... }
class OnSelfAndTargetEffect: EffectBase { ... }

接口将使层次结构的分支减少,但需要更多的代码来实现(这不是真正的问题,因为您可以将公共代码移动到方法中并调用它们)。

实体组件 approch 是解决您问题的好方法。 :)你应该投入更多的时间来理解它。

你总是必须在"是"或"有"关系之间做出决定。其中"是a"表示继承,"有"表示组合。

EntityComponents 上的事情是将每个游戏对象属性放入一个组件类中,然后将这些组件放在一起。您可以创建属性的每个组合,而无需或减少代码更改(取决于实现)。通过使用该应用程序,创建多人游戏也很容易,因为代码中只有几个地方可以放置通信内容。

另一方面是你会有很多课程,一切都是高度解耦的。总的来说,这是一个加分项,也是我们作为OO开发人员想要的。但是对于新开发人员或技能不高的开发人员来说,阅读起来可能会很糟糕。

因此,我建议您选择实体组件方法,因为您的游戏将来会更容易扩展。

与其为每种类型的魔法创建多个类,不如开始将它们全部封装在一个魔法类中,然后根据触发器从那里处理它们?

switch(castID) {
default:
    break;
case 1: //air strike
    Spell AirStrike = new Spell('AirStrike');
    break;
case 2:
    ...
}

然后有一个 Spell 类,并根据发送的参数处理其中的每个咒语