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



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

enemyType1是敌人的移动IP。

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
    }
}

只是它不起作用。我认不出敌人是物体。我还研究了每种敌人类型的多维数组,但无法使其发挥作用。

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

谢谢。

如果您想要比较类类型,请不要使用"==",而是使用"is"
也许它会起作用。

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

这是一项非常简单的任务,只需制作Enemy1和其他敌人类扩展的超级类Enemy即可完成。

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

尝试使用抽象类和继承:

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

最新更新