2

私は3つのクラスを持っています。

1つは、私の関数を持つグローバルクラスです。

public static function getDistance(ObjOne, ObjTwo)
{
    var distance = Math.sqrt( ( ObjOne.x - ObjTwo.x ) * ( ObjOne.x - ObjTwo.x ) + ( ObjOne.y - ObjTwo.y ) * ( ObjOne.y - ObjTwo.y ) );
    return distance;
}

それから私はMovieClipクラスであるを持っています:Minionそして別のものは呼ばれます:Turret

Minion私が呼んでいるクラスでは:Global.getDistance

そして、引数を次のように設定します。Global.getDistance(this, ?????)

最終パラメータのTurretクラスからTurretオブジェクトを取得するにはどうすればよいですか?

4

3 に答える 3

0

各ミニオンにターゲットとする単一の砲塔がある場合は、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);
    }
}
于 2012-09-17T21:11:37.237 に答える
0

ゲームにタレットが1つしかない場合は、シングルトンデザインパターンを使用できます。

private static var instance:Turret = null;

public static function getInstance()
{
    if(instance === NULL)
        instance = new Turret();
    return instance;
}

したがって、Turret.getInstance()を呼び出して、Turretオブジェクトを使用できます。それが役に立てば幸い。複数のタレットがある場合は、すべてのタレットを含む配列またはベクトルを含むゲームクラスが必要です。

于 2012-09-17T20:33:04.163 に答える
0

私はあなたが正確に何を必要としているのか、2番目のパラメータのタイプがわかりませんか?グローバル関数を扱っているDisplayObjectので、両方ともx / yプロパティがあるので、使用することをお勧めします

public static function getDistance(clip1:DisplayObject, clip2:DisplayObject):Number     
{ 
   return Math.sqrt( ( clip1.x - clip2.x ) * ( clip1.x - clip2.x ) + ( clip1.y - clip2.y ) * ( clip1.y - clip2.y ) );
}
于 2012-09-17T20:38:00.667 に答える