2012-01-03 6 views
0

これは私を数時間夢中にさせている。私は、同じクラスにあるメソッドkill();(関数takeDamage())を呼び出そうとしますが、見つからないでしょう。AS3 - エラー#1180:おそらく定義されていないメソッドを呼び出す。

package classes.ship 
{ 
imports ... 

public class Ship extends MovieClip 
{ 
    var speed:Number; 
    var shootLimiter:Number; 
    public static var health:Number; 
    public static var maxHealth:Number; 

    public function initialize() 
    { 
     var stageReff:Stage = this.stage as Stage; 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP, reportKeyUp); 
     stage.addEventListener("enterFrame", move); 
    } 

    //code 

    public static function takeDamage(d):void 
    { 
     health -= d; 

     if(health <= 0) 
     { 
      health = 0; 
      kill(); 
     } 

     Main.healthMeter.bar.scaleX = health/maxHealth; 
    } 

    public function kill():void 
    { 
     var boom = new Explosion(); 
     stage.addChild(boom); 
     boom.x = this.x; 
     boom.y = this.y; 
     this.visible = false; 
     //Main.gameOver(); 
    } 

    //code 
} 
} 

var stageReff:Stage = this.stage as Stage;とは関係がありますか?

ありがとうございます。

答えて

2

kill()はインスタンスメソッドですが、takeDamageは静的クラスメソッドです。静的クラスメソッドからインスタンスメソッドを呼び出すことはできません。インスタンスメソッドを呼び出すためのインスタンス参照がある場合にのみインスタンスメソッドを呼び出すことができます。

+0

私は今、とても愚かな気がしますが、メソッドのインスタンスを作成するにはどうすればいいですか?それはおそらくとても簡単ですが、私はそれを見つけることができません。 –

+1

@RobbeVanWinckelメソッドのインスタンスを作成することはできません。問題は、takeDamage()がShipクラスのクラスに属するメソッドであることです(Shipタイプのオブジェクトではありません)。残りのコードから判断すると、takeDamage()とhealth変数​​の両方から "static"キーワードを削除するだけで、プレーヤー(インスタンス)に属しているように見えます。 – weltraumpirat

+0

@weltraumpiratの問題は、別のクラスでそのメソッドを使用することです。静的な単語を削除すると、 'エラー#1119:静的型のクラスを持つ参照でおそらく未定義のプロパティmaxHealthにアクセスします。それをどうすれば解決できますか? –

0

年中無休の素敵なシンプルなもの!

あなたは静的メソッドとして関数 'takeDamage'を宣言しました。これはクラスShipの特定のインスタンスに属していないことを意味します。クラス自体に属します。

クラスメンバプロパティ

この例では、船舶のための新しいクラス定義を宣言する:静的なメソッドとプロパティを使用すると、OOPに新しいですが、簡単に簡単な例を通じて説明されている場合は少し混乱することができますsetSpeed()を使って船のインスタンスの速度を定義することができます。

public class Ship { 
    private var speed : Number; 

    public function setSpeed(value : Number) : void { 
     this.speed = value; 
    } 

    public function getSpeed() : Number { 
     return this.speed; 
    } 
} 

今、私たちは船のカップルを作成し、その速度を設定します:あなたは、上から見ることができるように

var scoutShip : Ship = new Ship(); 
scoutShip.setSpeed(500); // Scout's are fast! 

var cargoShip : Ship = new Ship(); 
cargoShip.setSpeed(10); // Cargo ships are sloooow. 

trace("Scout Ship Speed: " + scoutShip.getSpeed()); // 500 
trace("Cargo Ship Speed: " + cargoShip.getSpeed()); // 10 

、我々が作成船の各新しいインスタンスには、独自のスピードを持つことができますこれはオブジェクト指向プログラミング(船がオブジェクトで、速度がデータである)の基本です。

静的プロパティ

今、私たちは静的キーワードの使用を注意して、代わりに静的プロパティを使用して別のクラス、StaticShipと呼ばれる今回作成します。スピードので

public class StaticShip { 
    private static var speed : Number; 

    public function setSpeed(value : Number) : void { 
     this.speed = value; 
    } 

    public function getSpeed() : Number { 
     return this.speed; 
    } 
} 

をプロパティは静的で、StaticShipのすべてのインスタンスで共有されます。例えば:両方StaticShipsは10で移動する方法を

var scoutShip : StaticShip = new StaticShip(); 
scoutShip.setSpeed(500); // So the scout should move at 500 

var cargoShip : StaticShip = new StaticShip(); 
cargoShip.setSpeed(10); // ... and the Cargo move at 10, as before 

trace("Scout Ship Speed: " + scoutShip.getSpeed()); // 10 
trace("Cargo Ship Speed: " + cargoShip.getSpeed()); // 10 

はお知らせ - StaticShipの「スピード」プロパティが静的宣言されているとして、それが全体で共有されている - これは我々が最後の「cargoShip」インスタンスのスピードを設定しているためでありますそのクラスのすべてのインスタンス。

クラスで静的プロパティを持つことができるように、静的関数を持つこともできます。通常、クラスのメソッド(setSpeed())を呼び出すと、そのメソッドをインスタンス(つまりscoutShip.setSpeed(500);)で呼び出す必要がありますが、静的メソッドを使用すると、特定のクラスの他の静的メンバーとやり取りできます。例:

静的メソッド例

public class StaticMethodShip { 
    private static var speed : Number; 

    // Note that setSpeed is now declared as static 
    public static function setSpeed(value : Number) : void { 
     this.speed = value; 
    } 

    public function getSpeed() : Number { 
     return this.speed; 
    } 
} 

今、我々はまだ以前のようにStaticMethodShipの新しいインスタンスを作成することができますが、私たちは今、staticとして「setSpeed」と宣言しているので、私たちはsetSpeed呼び出すことはできません例:

var scoutShip : StaticMethodShip = new StaticMethodShip(); 

// This call will trigger Error #1180 - Call to a possibly undefined Method because 
// setSpeed was declared as static. 
scoutShip.setSpeed(500); 

代わりに、我々は今だけ、すなわち、StaticMethodShipクラス上のsetSpeed()メソッドを呼び出すことができます。

// Set the speed of all StaticMethodShip instances. 
StaticMethodShip.setSpeed(250); // all StaticMethodShips travel at 250. 

// Proof! 
var shipOne : StaticMethodShip = new StaticMethodShip(); 
var shipTwo : StaticMethodShip = new StaticMethodShip(); 

trace("ShipOne Speed: " + shipOne.getSpeed()); // 250 
trace("ShipTwo Speed: " + shipTwo.getSpeed()); // 250 
あなたが のために与えられたクラスの全てのインスタンス(すなわち動作を定義したいとき

静的メソッドが便利です。すべてのStaticMethodShipsが指定された速度で移動し、すべてTweensが0.25秒間消えます。 (用法で

public class StaticExampleOne { 
    public static function getName() : String { 
     return "Robbe"; 
    } 

    public function traceName() : void { 
     // traces 'Robbe'. 
     trace(getName()); 
    } 
} 

:メンバーのレベルのメソッドは静的メソッドを呼び出すことができます、すなわち - しかし、彼らはまた、あなたのエラーが表示されている理由には、そのような今Static Factory Method

などの一般的なデザインパターンで使用されていますnew StaticExampleOne().traceName())これはうまく動作します - メンバー・メソッドは、問題なく静的メソッドにアクセスすることができますが、これは他の方法で回避動作しません:彼らは知らない:

public class StaticExampleTwo { 
    private var name : String = "Robbe"; 

    public function getName() : void { 
     return this.name; 
    } 

    public static function traceName() : void { 
     // Throws Error #1180. 
     trace(getName()); 
    } 
} 

を静的メソッドには何のスコープ(すなわちを持っていないためですイン他の静的メンバーを参照するだけであるため参照されている)、クラスレベルメンバ(メソッドおよびプロパティ)にアクセスすることはできません。

問題を解決するには、STAGEという新しい静的プロパティを導入することができます(通常は静的プロパティがすべてのCAPSでメンバープロパティと区別されます)。kill()メソッドを静的にします。

希望と幸運を願っています! ジョニー。

+0

これを行うことでエラーを取り除いた。今はコードを実行しないという問題があります。どのようにそれを解決するための任意のアイデアですか? –

関連する問題