2013-10-03 42 views
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; 
    } 

} 

回答

1

如果你給你的敵對階級一個_distance財產和訪問_player例如,每個敵人的距離屬性可以通過計算:

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

然後,如果你的敵人是在一個數組,您可以通過距離屬性排序的數組:以上

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

假設你有你的敵人類_distance一個「吸」的方法。根據排序是升序還是降序,最近的敵人將是_enemies [0]或_enemies [_enemies.length-1]。

這也假設你在三維工作,但在2D中,你可以使用Point來代替Vector3D。

順便說一句,一旦你建立了最接近的敵人,你可以在敵人的這個實例上調用一個方法(例如,尋找玩家)來設置它向玩家移動。爲了讓敵人檢查它是否面向玩家,我建議使用Math.atan2((相對y座標),(相對x座標))來獲得玩家的角度(注意atan2使用y座標首先,角度'0'在'3點')。

+0

嗨moosefetcher。感謝您的幫助和代碼。我實現了你的建議代碼並追蹤出_distance。然而,因爲我在舞臺上有兩個敵人,所以這兩個敵人的距離都是X和Y座標。我用我用來檢測最近的敵人的方法更新了我的問題。 – Human

+0

有2個原因不起作用。您需要從更新它們的循環的外部對您的enemyObejctsArray進行排序。另一個是你沒有對那個可以在那個循環之外訪問的每個敵人的'距離'屬性。您需要爲每個敵方對象添加距離屬性。 – moosefetcher