0

これが私の問題です。私のドキュメントクラスTowerDefenseGame.asで、変数Turrent1Flagを定義しました。

package 
{
import flash.display.MovieClip;
import flash.events.*;
import flash.display.Sprite;
import flash.display.Shape;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldType;

public class TowerDefenseGame extends MovieClip
{
       public var Turrent1Flag==0;
}

public function TowerDefenseGame()
{
  ......
}

次に、別のクラスTurrent1Button.asで、マウスクリックイベントを作成する必要があります。これにより、Turrent1Flagが1に設定されます。

package 
{
import flash.display.MovieClip;
import flash.events.*;
import flash.display.Sprite;
import TowerDefenseGame;

public class TurretButton1 extends MovieClip
{
    public var ButtonBase:Sprite=new Sprite();
    public var TurretBase:Sprite=new Sprite();
    public var Gun:Sprite=new Sprite();

    public function TurretButton1()
    {
               ......
       this.addEventListener(MouseEvent.CLICK, MouseClick);
    }

    public function MouseClick(event:MouseEvent):void
    {
        MovieClip(root).Turret1Flag = 1;
    }

まあ、これは機能しません。Adobe flash cs6を使用していますが、値にアクセスできないと表示されます。誰かがこれを行う方法を知っていますか?

4

3 に答える 3

1

これを試して:

private static var _instance:TowerDefenseGame;
public static function get instance():TowerDefenseGame { return _instance; }

public function TowerDefenseGame() 
{
    _instance = this;
}

public function MouseClick(event:MouseEvent):void
{
       TowerDefenseGame.instance.Turret1Flag = 1;
}
于 2013-03-02T23:30:29.753 に答える
1

したがって、最初に、AS3を使用すると、AS2でこれまで行ってきたことを意図的に行うことが難しくなり、オブジェクト指向のプラクティスが向上します。クラス間に高くてタイトな壁を維持すると、クラスBに何の影響も与えずに、クラスAを変更するのが簡単になります。クラスBは、クラスAの家への「公式」の方法であるドアと窓しか知りません。ソファを動かしてもかまいません。また、クラスAを同様のドアと窓を持つクラスCに非常に簡単に置き換えることができます。

グローバル状態を導入して壁を通り抜ける場合、クラスAはクラスBを直接参照し、ソファがどこにあるかを正確に知っているため、クラスAを変更せずにクラスBをクラスCに置き換えることはできません。

これを処理する1つの方法は、制御の反転(IoC)を使用することです。したがって、私たちの家の場合、ソファは外部から供給され、供給されたコンポーネントがそれを参照している可能性があるため、家のどこに行ってもソファにアクセスできます。したがって、あなたはあなたを作成し、TurretButtonそれを所有する人にそれを渡すことを選択するかもしれませんが、あなたはTowerDefenseGameそれへの参照を保持し、それを直接リッスンし、クリックに応じて独自のフラグを変更します。

TurretButtonあなたのコードを見ると、あなたが実際にネストされているという兆候が見当たらないので、おそらくそれほど遠くまで行く必要はありません。その場合、ステージ上で作成する場合でも、コードを使用して作成する場合でも(私は好きではありません)、直接聞くことができます。IDEでステージを使用していて、それがステージ上に存在する場合は、タイプのパブリック変数を作成するだけです(または、表示したコードに基づいて特別なクラスが必要なくなったため、TurretButtonおそらく使用できます)。 SimpleButton)。そのインスタンスは、TowerDefenseGame。イベントリスナーを追加するだけで、変更するリスナーと変数が同じスコープになります。エルゴ、あなたが解決しようとしていた問題は決して存在しませんでした-あなたは単に物事を過度に複雑にする観点から問題を見ていました。

実際、コード表示されていない方法でネストされている場合は、ActionScript 3のイベントシステムを使用できます。これは、直接結合を導入することなく、またコードを介してボタンを作成して押し下げることなく、問題を処理できます。それが使用される場所。1つの方法は、マウスのクリックをリッスンし(バブリングイベントであるため)、クリックされたものを確認することです。別の解決策は、ボタンからカスタムイベントを生成し、それをトップレベルからリッスンしてフラグを変更することです。これは次のようになります。

パッケージview.button{
   パブリッククラスTurretButtonはMovieClipを拡張します{
      パブリック関数TurretButton(){
         素晴らしい();
         mouseChildren = false;
         addEventListener(MouseEvent.CLICK、broadcastTurretEvent);
      }
      保護された関数broadcastTurretEvent(e:Event):void {
         dispatchEvent(new Event('turretClicked'、true));//trueパラメーターはそれをバブルにします
      }
   }
}

次に、タワークラスは次のようになります

パッケージ {
   パブリッククラスTowerDefenseGameはMovieClipを拡張します{
      // Turret1Flagと呼んでいるという事実は、1つ以上あることを示唆しています
      protected var turretFlags:Array / * of Boolean * / = [false、false];
      //タレットボタンインスタンス  
      //ネストを表示しません、これは単にそれを示すためです
      //これらは名前付きインスタンスなので、どのように呼ばれるかがわかります
      //任意のレベルでネストできます    
      public var turret1:TurretButton;
      public var turret2:TurretButton;
      //...等。
      パブリック関数TowerDefenseGame(){
         素晴らしい();
         addEventListener('turretClicked'、onTurretClicked);
      }
      保護された関数onTurretClicked(e:Event):void {
         //数値を抽出して計算することもできます
         //正しい配列インデックスを取得するには
         switch(e.target.name){
            ケース'turret1':
               turretFlags [0] =!turretFlags [0];
               壊す;
            ケース'turret2':
               turretFlags [1] =!turretFlags [1];
               壊す;
         }
      }
   }
}

これがどれほどうまくスケーリングするかに注意してください。個別のフラグを変更するために、ボタンごとに異なるクラスを用意する必要はありません。コードを大幅に変更することなく、ボタンを追加するのも簡単です。このソリューションをさらに進めて、どのボタンがクリックされたかを示すプロパティを持つカスタムイベントを作成し、依存性注入などを介してボタンに使用する値を指定できます。

また、コードでは、フラグはブール値である必要があり、最初のクリックでオンになり、2回目のクリックでオフになる、などと仮定しました。同じ考えを採用して、たとえば、毎回インクリメントするように変更できます。クリック。コードが表示していたことを実際に実行したくないのではないかと思います。最初のクリックでオンにして、永久にオンのままにしておきます。

もう1つの注意点は、長期的にAS3でコーディングしたい場合は、AS3で使用されているコーディング規則を学ぶ必要があるということです。これらの1つは、クラス名が大文字で始まることですが、プロパティとメソッドは大文字ではありません。

于 2013-03-03T16:10:51.110 に答える
0

おそらくすべてに取り組むのは良い習慣ではありませんが、静的変数はここで機能するように見えます。

public class TowerDefenseGame extends MovieClip
{
    public static var Turrent1Flag = 0;
}

Turrent1Button.asの場合:

public function MouseClick(event:MouseEvent):void
{
    TowerDefenseGame.Turret1Flag = 1;
}
于 2013-03-03T00:13:40.193 に答える