所以我在找出一种在游戏中实施法术的方法时遇到了麻烦。问题是我想添加许多不同的法术(如传送,心灵遥控,火控等)。我尝试的第一件事是创建一个大类层次结构,如:
Spell -> Passive ->Speed
->Flying
-> Active ->Teleportation
Telekinesis
一开始看起来不错,但是当我开始实施很多咒语时,它开始变得混乱。
我已经搜索了其他解决方案,我发现了基于实体组件的系统。但我认为它不是一个好的解决方案。 那么你们中任何人都知道有任何其他解决这个问题的方法吗?
答案 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处理每个法术