Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在AS3中,如何在没有继承的情况下为多个类提供额外的功能?_Actionscript 3_Game Engine - Fatal编程技术网

Actionscript 3 在AS3中,如何在没有继承的情况下为多个类提供额外的功能?

Actionscript 3 在AS3中,如何在没有继承的情况下为多个类提供额外的功能?,actionscript-3,game-engine,Actionscript 3,Game Engine,我正在用ActionScript编写一个游戏,在这个游戏中,我有多个类可以通过射击“命中” 所有其他游戏中实体继承的最通用的类是CombatObject;战斗力、战斗类固醇和其他各种职业都是从它继承而来的。CombatAi和CombatPlayer类都继承自CombatShip 现在我想让战斗人员、战斗玩家和战斗类固醇可以被射击击中,但我不想让他们继承它(以后可能会有不应该被击中的战斗舰) 我现在的想法是让这三个实现一个接口,IHitable,这样当它们与快照碰撞时,我可以询问是否(hitObj

我正在用ActionScript编写一个游戏,在这个游戏中,我有多个类可以通过射击“命中”

所有其他游戏中实体继承的最通用的类是CombatObject;战斗力、战斗类固醇和其他各种职业都是从它继承而来的。CombatAi和CombatPlayer类都继承自CombatShip

现在我想让战斗人员、战斗玩家和战斗类固醇可以被射击击中,但我不想让他们继承它(以后可能会有不应该被击中的战斗舰)

我现在的想法是让这三个实现一个接口,IHitable,这样当它们与快照碰撞时,我可以询问
是否(hitObject是IHitable)
,如果为真,则销毁快照并造成伤害

现在的问题是,最好是每节课都上一节课吗

  • 实现所有需要的代码来自己承受伤害(如检查防护罩、计算伤害百分比等)
  • 让他们都拥有类
    DamageManager
    的实例,并实现一个函数
    getDamageManager():DamageManager
    ,该函数返回一个处理所有损坏相关功能的类
  • (2)的一个缺点是,每艘战斗舰、战斗类固醇等都必须拥有一个DamageManager实例。如果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中是这样。