C# 在游戏中使用大量咒语有困难

C# 在游戏中使用大量咒语有困难,c#,xna,C#,Xna,所以我很难找到在游戏中使用法术的方法。问题是,我想添加许多不同的法术(如远程传送、遥控、火力控制等)。我尝试的第一件事是创建一个大类层次结构,如: Spell -> Passive ->Speed ->Flying -> Active ->Teleportation Telekinesis 一开始看起来不错,但当我开始使用很多咒语时,它开始变得混乱起来 我搜索了其他解决方案,找到了

所以我很难找到在游戏中使用法术的方法。问题是,我想添加许多不同的法术(如远程传送、遥控、火力控制等)。我尝试的第一件事是创建一个大类层次结构,如:

Spell -> Passive ->Speed
                 ->Flying

      -> Active ->Teleportation
                  Telekinesis
一开始看起来不错,但当我开始使用很多咒语时,它开始变得混乱起来

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

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

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

然后为咒语建立一个类,并根据发送的参数处理其中的每个咒语,而不是为每种类型的魔法创建多个类,只需开始将它们全部封装在一个魔法类中,并根据触发器从那里处理它们

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

然后为拼写创建一个类,并根据发送的参数处理其中的每个拼写

如果您使用了类似的东西,那么您应该在何处拥有一个接口,该接口定义了一个方法,例如
ApplySpell()
,可能还有一个
Name
属性和所述接口实现的具体拼写

这样,对于每个字符,您可以迭代其指定的拼写,并使用
Name
属性获取名称(可能您希望通过UI或类似的方式列出它们),或者将它们存储在字典中,其中拼写的名称是键,实际的拼写实现是值

然后,您可以做的是,一旦用户选择了咒语,您所需要做的就是调用
ApplySpell()
,并且实际的咒语所做的事情被委托给表示该咒语的类


这样,您就不必担心需要调用哪个拼写了,因为一切都是在幕后进行的。

如果您使用了类似的东西,并且您需要一个接口来定义一个方法,例如
ApplySpell()
也许还有一个
名称
属性和实现该接口的具体拼写

这样,对于每个字符,您可以迭代其指定的拼写,并使用
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 { ... }

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

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

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

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

实体组件方法是解决问题的一个很好的方法。:) 你应该花更多的时间去理解它

你总是要在“是”或“有”关系之间做出决定。 其中“是”表示继承,“有”表示组成

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

另一方面,你会有很多类,所有的东西都是高度解耦的。一般来说,这是一个加号,也是我们作为OO开发者想要的。 但是对于一个新开发人员或者一个没有那么高技能的开发人员来说,这本书读起来可能很恐怖


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

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

你总是要在“是”或“有”关系之间做出决定。 其中“是”表示继承,“有”表示组成

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

另一方面,你会有很多类,所有的东西都是高度解耦的。一般来说,这是一个加号,也是我们作为OO开发者想要的。 但是对于一个新开发人员或者一个没有那么高技能的开发人员来说,这本书读起来可能很恐怖


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

我同意您的解决方案,但C#不是java,我认为“string SpellName{get;}”更适合。顺便说一句,我们使用的是拼写接口,因此“SpellName”是多余的。最后,“字符串名{get;}”就足够了。@Orace:我明白你的意思,完全同意。我没有注意到冷杉