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

时间:2015-01-07 08:44:31

标签: c# xna

所以我在找出一种在游戏中实施法术的方法时遇到了麻烦。问题是我想添加许多不同的法术(如传送,心灵遥控,火控等)。我尝试的第一件事是创建一个大类层次结构,如:

Spell -> Passive ->Speed
                 ->Flying

      -> Active ->Teleportation
                  Telekinesis

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

我已经搜索了其他解决方案,我发现了基于实体组件的系统。但我认为它不是一个好的解决方案。 那么你们中任何人都知道有任何其他解决这个问题的方法吗?

4 个答案:

答案 0 :(得分:3)

如果您使用类似Strategy Design Pattern之类的内容,并且您在哪里有一个界面来定义ApplySpell()Name属性以及具体 spell实现了所说的界面?

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

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

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

答案 1 :(得分:1)

继承没问题,但对于属性,您可以使用接口或基类作为属性:

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 { ... }

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

答案 2 :(得分:1)

Entity-Component approch是解决您问题的好方法。 :) 你应该花更多的时间来理解它。

你总是要在""之间做出决定。或者"有一个"关系。 其中"是"意味着继承和"有一个"意思是组成。

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

另一方面,你将有很多课程,一切都是高度分离的。总的来说,这是一个加号和我们想要的OO开发人员。 但对于没有那么高技能的新开发人员或开发人员来说,阅读起来可能很糟糕。

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

答案 3 :(得分:0)

不是为每种类型的魔法创建多个类,而是在一个Magic类中开始将它们全部包装起来并根据触发器从那里处理它们?

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

然后有一个Spell类,并根据发送的params处理每个法术