0

我目前正在使用 AS3 创建一个 Flash 游戏,并且目前已经达到了用户能够使用键盘使玩家角色在舞台上移动的地步。我目前有两个具有独特名称的敌人在编译游戏时被添加到舞台上。

我目前所坚持的是检测玩家离哪个敌人最近,并只让那个敌人旋转并向玩家移动。

public function updateEnemies(player:MovieClip):void{

    //run a for loop on our array and update every enemy object in there
    for(var i = 0; i < enemyObjectsArray.length; i++){

        var enemy:Object = enemyObjectsArray[i];

        //calculate distance between enemyObject's movieClip and target
        enemy.distanceX = player.x - enemy.myMc.x;
        enemy.distanceY = player.y - enemy.myMc.y;

        enemy.distanceTotal = new  Point(enemy.myMc.x - player.x, enemy.myMc.y - player.y);

        trace(enemy.distanceTotal);

        //sort the array based on the enemy object's "distanceTotal" parameter
        enemyObjectsArray.sortOn("distanceTotal", Array.NUMERIC);

        enemyObjectsArray[0].myMc.rotation = 10;
    }

}
4

1 回答 1

1

如果你给你的 Enemy Class 一个 _distance 属性并访问 _player 实例,每个敌人的 distance 属性可以通过以下方式计算:

_distance = Vector3D(x - _player.x, y - _player.y, z - _player.x);

然后,如果你的敌人在一个数组中,你可以按距离属性对数组进行排序:

_enemies.sortOn("distance", Array.NUMERIC);

以上假设您在 Enemy Class 上有一个 _distance 的“getter”方法。最近的敌人将是 _enemies[0] 或 _enemies[_enemies.length-1] 取决于排序是升序还是降序。

这也假设您在 3 维中工作,但在 2D 中您可以使用 Point 而不是 Vector3D。

顺便说一句,一旦您确定了哪个 Enemy 最接近,您就可以在该 Enemy 实例上调用一个方法(例如,追求播放器)以将其设置为向播放器移动。
要让 Enemy 检查它是否面向玩家,我建议使用 Math.atan2((relative y 坐标), (relative x 坐标)) 来获取与 Player 的角度(注意 atan2 使用 y 坐标首先,角度“0”位于“3 点钟”)。

于 2013-10-03T11:51:43.880 回答