したがって、最初に、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つは、クラス名が大文字で始まることですが、プロパティとメソッドは大文字ではありません。