AS3 - 控制不同敌人类型的敌人行为

时间:2013-08-22 02:26:52

标签: arrays actionscript-3 flash object

我一直在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]是一个物体。我还研究了每种敌人类型的多维数组,但无法使其发挥作用。

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

感谢。

3 个答案:

答案 0 :(得分:0)

如果你想比较班级类型,不要使用“==”但是要使用“是” 可能它会起作用。

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

答案 1 :(得分:0)

完成一个非常简单的任务就是制造一个超级敌人Enemy,Enemy1和其他敌人类别。

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

答案 2 :(得分:0)

尝试使用抽象类和继承:

// 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();
}