Actionscript 3 在AS3中,如何在没有继承的情况下为多个类提供额外的功能?
我正在用ActionScript编写一个游戏,在这个游戏中,我有多个类可以通过射击“命中” 所有其他游戏中实体继承的最通用的类是CombatObject;战斗力、战斗类固醇和其他各种职业都是从它继承而来的。CombatAi和CombatPlayer类都继承自CombatShip 现在我想让战斗人员、战斗玩家和战斗类固醇可以被射击击中,但我不想让他们继承它(以后可能会有不应该被击中的战斗舰) 我现在的想法是让这三个实现一个接口,IHitable,这样当它们与快照碰撞时,我可以询问Actionscript 3 在AS3中,如何在没有继承的情况下为多个类提供额外的功能?,actionscript-3,game-engine,Actionscript 3,Game Engine,我正在用ActionScript编写一个游戏,在这个游戏中,我有多个类可以通过射击“命中” 所有其他游戏中实体继承的最通用的类是CombatObject;战斗力、战斗类固醇和其他各种职业都是从它继承而来的。CombatAi和CombatPlayer类都继承自CombatShip 现在我想让战斗人员、战斗玩家和战斗类固醇可以被射击击中,但我不想让他们继承它(以后可能会有不应该被击中的战斗舰) 我现在的想法是让这三个实现一个接口,IHitable,这样当它们与快照碰撞时,我可以询问是否(hitObj
是否(hitObject是IHitable)
,如果为真,则销毁快照并造成伤害
现在的问题是,最好是每节课都上一节课吗
DamageManager
的实例,并实现一个函数getDamageManager():DamageManager
,该函数返回一个处理所有损坏相关功能的类选项1将导致大量重复的代码,这显然是不好的 选项3意味着所有冲突代码都进入一个类。从封装的角度来看,这是不好的,因为最终会得到一个处理所有事情的庞然大物类 这使得选项2成为最佳选项。选项2优于选项3,因为您可以为不同类型的船舶和小行星扩展DamageManager类 然而,我还想提出一个选项4:混合
mixin是一种语言级特性,允许您在不继承的情况下向多个类添加公共功能。尽管ActionScript3语言不支持mixin,但AS3足够灵活,您可以模拟它 在IHitable接口中实现一个isHitable getter怎么样?如果您想在游戏的后期对某些类进行更改,这可以提供更大的灵活性,因为对于IHitable实例,“is IHitable”将始终返回true
根据计算类型和结果修改,DamageManager实际上不必是单例,您可以调用一个静态方法来处理损坏评估并返回修改的对象。混合是一个好主意,但它在AS3中的支持是模拟的 选项2将起作用,但公开DamageManager实例会破坏封装。您可以通过在IHitable接口中添加hit方法来解决此问题。当有东西击中此对象时,游戏将调用此方法。该方法的实现取决于对象。您可以为每个对象分别实现它(选项1),但也可以创建一个通用的DamageManager类并使用它来计算损害
class DamageManager {
public function calculateDamage(...){
// implement your damage logic...
}
}
interface IHitable {
function hit(by:GameObject);
}
例如在《战斗玩家》中
class CombatPlayer implements IHitable
{
private var _damage:DamageManager;
public function CombatPlayer(){
_damage = new DamageManager();
}
public function hit(by:GameObject):void {
_damage.calculateDamage(...);
}
}
由于我不知道您的对象是如何实现的,也不知道您希望如何计算损失,所以我将DamageManager上的实现保持为打开状态
class DamageManager {
public function calculateDamage(...){
// implement your damage logic...
}
}
interface IHitable {
function hit(by:GameObject);
}
我认为理想情况下,DamageManager不应该直接修改您的对象。您可以传递一个Stat对象(保存对象的健康和防护信息)以及另一个描述“打击者”属性的对象,DamageManager将返回另一个Stat对象,您可以使用它更新“打击者”的统计信息
希望它有意义 选项3仅在命中检测(在镜头中)认定该镜头确实命中且该对象可命中后才被调用。然后,它会根据某种算法进行伤害计算,并将伤害传递给被击中的物体。好吧,这个想法是只给那些类IHitable接口,它们是“可击中的”,即CombatPlayer、CombatAi、CombatAsteroid;但不是战斗。使用静态方法而不是单例方法有什么好处?单例不是一个只有一个静态方法实例的类吗?接下来你会说,在游戏的后面,有些战舰可能无法命中。至于单身汉,不,不是真的。。。单一的静态方法无法与单一的类相媲美。你对封装的看法是完全正确的,这看起来很糟糕,我从来没有注意到。你关于stat对象的想法很有趣:你想操纵多个“hitee”的值,但你不想传递一个引用到它本身(即直接操纵它),所以你使用stat对象作为容器来来回传递信息并保持封装完整?另一个问题:这是返回多个值时的一般最佳实践吗?是的,正是这样。对于您的另一个问题,我不确定是否有其他方法可以返回多个值,而不是返回具有这些值的对象,至少在AS3中是这样。