【问题标题】:AS3 - Controlling enemy behaviour for different enemy typesAS3 - 控制不同敌人类型的敌人行为
【发布时间】:2013-08-24 14:38:15
【问题描述】:

我一直在 AS3 中开发一个简单的游戏,但我似乎无法为不同类型的敌人添加移动。到目前为止,它仅适用于 1 种敌人类型:

enemyType1 是敌人的影片剪辑。

var enemyType1:EnemyType1 = new EnemyType1(0, 0);
var enemies:Array = new Array();

在我的游戏循环中,我随机生成敌人并有一个 for 循环,该循环遍历所有敌人,并为每个敌人执行移动。

if(Math.random() < 0.5)
{
    var newEnemyType1 = new EnemyType1(0, 0);
    enemies.push(newEnemyType1);
    addChild(newEnemyType1);
}

for (var i:int = 0; i < enemies.length; i++)
{
    //Movement
}

当创建不同类型的敌人并确定敌人是哪种类型的敌人时,问题就出现了,这样才能使用正确的移动类型。这变成:

var enemyType1:EnemyType1 = new EnemyType1(0, 0);
var enemyType2:EnemyType2 = new EnemyType2(0, 0);
var enemies:Array = new Array();

在游戏循环中:

if(Math.random() < 0.5)
{
    var newEnemyType1 = new EnemyType1(0, 0);
    enemies.push(newEnemyType1);
    addChild(newEnemyType1);
    var newEnemyType2 = new EnemyType2(0, 0);
    enemies.push(newEnemyType2);
    addChild(newEnemyType2);
}

for (var i:int = 0; i < enemies.length; i++)
{
    if(enemies[i] == EnemyType1)
    {
        //EnemyType1 Movement
    }
    else if(enemies[i] == EnemyType2)
    {
        //EnemyType2 Movement
    }
}

除非它不起作用。我无法识别敌人[i] 是一个对象。我还查看了每种敌人类型的多维数组,但无法让它发挥作用。

所以问题是,如何检测数组中的特定对象? 或者这是控制多种敌人类型的完全错误的方式?

谢谢。

【问题讨论】:

    标签: arrays actionscript-3 flash object


    【解决方案1】:

    尝试使用抽象类和继承:

    // Abstract enemy class
    public class AEnemy()
    {
        public function Move():void
        {
            // standard move code here
        }
    }
    
    // Concrete enemy class. Inherits Move code
    public class EnemyOne() extends AEnemy
    {
    
    }
    
    // Concrete enemy class two, overrides inherited movement code with it's own.
    public class EnemyTwo() extends AEnemy
    {
        override public function Move():void
        {
            // Different move code here
        }
    }
    
    /* ---- In controller ---- */
    
    // typed array of enemies, can contain anything that extends AEnemy.
    // Will also see them only as an 'AEnemy'
    private var _enemies:Vector.<AEnemy> = new Vector.<AEnemy>();
    
    // update loop
    for (i = 0; i < l; i++)
    {
        // Move code is handled internally by the enemy classes themselves
        _enemies[i].Move();
    }
    

    【讨论】:

      【解决方案2】:

      这是一个非常简单的任务,只需创建一个超类 Enemy,Enemy1 和其他敌人类扩展。

      在 Enemy 类中,您可以创建一个 move() 方法,您可以在循环中调用该方法。

      【讨论】:

        【解决方案3】:

        如果你想比较类类型,不要使用“==”,而是使用“is”。
        可能会奏效。

        if(enemies[i] is EnemyType1)
        {
            //EnemyType1 Movement
        }
        else if(enemies[i] is EnemyType2)
        {
            //EnemyType2 Movement
        }
        

        【讨论】:

        • 呃!由于效率,我决定改用 switch 语句和 getQualifiedClassName。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 2015-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        相关资源
        最近更新 更多