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:我明白你的意思,完全同意。我没有注意到冷杉