各ミニオンにターゲットとする単一の砲塔がある場合は、Minion
クラス内の砲塔への参照を保持する必要があります。距離を取得するための静的関数は必要ありません(ミニオン/タレットの関係以外の目的で使用されている場合を除く)。
タレットがすべてのミニオンを認識できるようにするには(攻撃するミニオンを決定するため)、これを行うための良い方法は、静的に評価可能なベクトル(配列)にすべてを格納することです。
Minionクラスのサンプルは次のとおりです。
public class Minion {
public static var allMinions:Vector<Minion> = new Vector<Minion>(); //create a static array to store all your minions
public var turret:Turret;
public function Minion(targetTurret:Turret):void {
turret = targetTurret;
this.addEventListener(Event.ADDED_TO_STAGE,addedToStage,false,0,true);
this.removeEventListener(Event.REMOVED_FROM_STAGE,removedFromStage,false,0,true);
}
private function addedToStage(e:Event):void {
allMinions.push(this); //add this minion instance to the array when it's added to the display list
}
private function removedFromStage(e:Event):void {
//remove this minion instance from the array of all minions when it's removed from the display list
var index:int = allMinions.indexOf(this);
if(index >= 0){
allMinions.splice(index,1);
}
}
private function move():void { //whatever function you use to move the minion along
//get distance here, using your local turret var
getDistance(this,turret); //this could be a local function, or some static function somewhere - local is faster, especially if being called everyframe or in a loop.
}
//a function to take damage, returns true if still alive after the damage
public function takeDamage(amount:Number):Boolean {
this.health -= amount * armor; //armor could be a value between 1 (no armor) and 0 (invincible)
if(health <= 0){
//die
return false;
}
return true;
}
}
これは、新しいミニオンを作成するときに適切なタレットを通過します- new Minion(turretInstance)
、いつでもディスプレイリストにあるすべてのミニオンを保持する静的にアクセス可能な配列を持っています。また、ダメージを受ける機能を追加します
砲塔を攻撃するには、すべてのミニオンの配列をスキャンして、攻撃するのに十分近いものを特定する必要があります。すべてを攻撃するか(砲塔のタイプの場合)、攻撃するミニオンを1つ(通常は最も近いもの)選択します。
タレットクラス:
public var range:Number = 200; //how close to the turret a minion needs to be before it can attack
public var attackPower:Number = 10; //how much damage does this turret cause
public function attack():void {
//this for loop goes through all the minions and finds the closest one
var closestMinion:Minion;
var tmpDistance:Number; //
var distance:Number;
for each(var minion:Minion in Minion.allMinions){
distance = Math.sqrt( ( minion.x - this.x ) * ( minion.x - this.x ) + ( minion.y - this.y ) * ( minion.y - this.y ) ); //find the distance between the current minion in the loop and this turret
if(distance < range && isNaN(tmpDistance) || distance < tmpDistance){ //if the distance of this minion is less than the current closest, make the current closest this one
closestMinion = minion;
tmpDistance = distance;
}
}
//attack the closest one
if(closestMinion){
closestMinion.takeDamage(attackPower);
}
}