2011-12-13 11 views
-1

私は小さなフラッシュゲームをコーディングしており、クラス間で異なる機能にアクセスすることはできません。 C#では静的にするのに慣れていましたが、いくつか問題があります。ここでAS 3.0のパブリック静的関数

が行く:

Main.as

package 
{ 
import Bus; 
    import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.Stage; 

public class Main extends Sprite 
{ 
    public function Main() 
    { 
     addBus(); 
    } 
} 
} 

をBus.as

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.Stage; 

public class Bus extends Sprite 
{ 
    public function Bus() 
    { 
    } 

    private static function addBus() 
    { 
     var bus:Bus = new Bus(); 

     bus.x = stage.stageWidth/2; 
     bus.y = stage.stageHeight/2; 

     addChild(bus); 
    } 
} 
} 

私はそれを行うことができないのはなぜ?

+0

Bus.addBus()、tut tutが見つかりません – Ryan

答えて

0

Busクラスのstatic関数はprivateに設定されています。あなたがそれを公開するなら、うまくいくはずです。

編集:私はそれがあなたが探していた答えだとは思わない。静的関数は、そのクラスのインスタンスについて何も知らない。静的関数内でaddChild()を呼び出すことはできません。なぜなら、静的関数には何を割り当てるのか分からないからです。メインクラスまたはステージのインスタンスをaddBus関数に渡す必要があります。例えば

public static function addBus(mainObj) { 
    //do your stuff here 
    mainObj.addChild(bus); 
} 

次に、あなたの主な機能は

0

また、私はあなたがあなたの主な機能にBus.addBus()を追加する必要があると考えているが、私が行っているので、それがしばらくされている(この)addBusを呼び出しますAS3プログラミング

1

あなたにはいくつかの問題があります。 最初に、静的メソッドを呼び出すには、そのクラスを参照する必要があります。

Bus.addBus(); 

これは、フラッシュを使用すると、メインクラスの「addBus()」と呼ばれる方法バスクラスの静的メソッドを参照する、とされていないかを知ることができます。

第2に、Bus.addBus()メソッドでは、非静的変数を参照します。これは問題を引き起こす可能性があります。特に、ステージ・オブジェクトを参照します。ステージ・オブジェクトは静的ステージがないため、nullになります。代わりに、ステージへの参照を渡すか、関数から新しいバスを返すことができ、呼び出し側クラスに適切な方法でリストを表示させることができます。

2番目の方法をお勧めします。

さらに、addBus()静的メソッドの計画があるかもしれません。 =========================

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.Stage; 

public class Bus extends Sprite 
{ 
    public function Bus(stageReference:Stage) 
    { 

     this.x = stageReference.stageWidth/2; 
     this.y = stageReference.stageHeight/2; 

     stageReference.addChild(bus); // This is kind of bad form. Better to let the parent do the adding. 
    } 
} 
} 

:しかし、私はあなたが簡単にそうようなコンストラクタを通じて、非常に機能性を達成する可能性が指摘う============================応答

編集ActionScriptで

コメントする、静的メソッドは、例外でありますルールではありません。したがって、バスを作成するには、次のようにコードを変更します。コメントはコードを説明しています。

package 
{ 
import Bus; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.Stage; 

public class Main extends Sprite 
{ 
    public function Main() 
    { 
     // Add a new member variable to the Main class. 
     var bus:Bus = new Bus(); 
     // we can call methods of our Bus object. 
     // This imaginary method would tell the bus to drive for 100 pixels. 
     bus.drive(100); 
     // We would add the bus to the display list here 
     this.addChild(bus); 
     // Assuming we have access to the stage we position the bus at the center. 
     if(stage != null){ 
       bus.x = stage.stageWidth/2; 
       bus.y = stage.stageHeight/2; 
     } 
    } 
} 
} 

これは、クラスのインスタンスを作成し、静的メソッドを必要とせずにアクセスする方法です。"new"キーワードは事実上、クラスのコンストラクタメソッドを呼び出すためのショートカットであり、クラスの新しいインスタンスを返します。 "new"を呼び出す親はそのインスタンスを子として持ち、そのすべてのパブリックメソッドとプロパティを呼び出すことができます。

+0

Main.asでどのように関数を呼び出すのか分かりません。それでは、Bus.addBus(?)をしてください。さらに、私は静的にしないと、私は関数にアクセスすることはできません?主なアイデアは、Bus.asで全機能を実行してから、Main.asでshow(Bus.addBus();)と呼ぶだけでした。 –

+0

上記の答えをさらに追加してください。 –