アクションスクリプト3:EventListeners の追加と削除 (動的名と動的変数を使用)
-
20-09-2019 - |
質問
Flash Action Script 3 でボードゲームを作成しています。ボード上の各位置は次のようなボタンです。button_1_1、button_1_2などキャラクターが選択されるたびに、それを移動する必要があるため、スクリプトは選択したユニットの周囲の位置にイベント リスナーを追加する必要があります。
// This function adds or deletes an event listener
function listentoButton (isTrue:int, position_x:int, position_y:int):void {
var myFunction:Function = new Function;
myFunction = function ():void {userClickedPosition(position_x, position_y)};
if (isTrue == 1) {
this["button_position_"+(position_x)+"_"+(position_y)].addEventListener(MouseEvent.CLICK, myFunction);
} else {
this["button_position_"+(position_x)+"_"+(position_y)].removeEventListener(MouseEvent.CLICK, myFunction);
}
}
コードの残りの部分には次のものがあります。
関数 userClickedPosition(position_x:int,position_y:int)
ユニットを選択または選択解除します関数 selectUnit(位置_x:int, 位置_y:int):
listentoButton(1) 関数を使用して 8 つのリスナー (クリックされたユニットの周囲の位置) を追加します。関数 deselectUnit(位置_x:int, 位置_y:int):
listentoButton(0) 関数を使用して 8 つのリスナー (クリックされたユニットの周囲の位置) を削除します。
私の質問: イベントリスナーを追加することは問題ありませんが、それらを削除すると機能しないように思えますか?私が何を間違えたのでしょうか?
解決
、あなたはMyFunctionの新しいインスタンスではなく、あなたがそれを追加したのと同じものを使用しています。あなたは他のあらゆる関数のように関数を宣言する必要がある、などのボタンの位置を調べるためにイベント引数を使用しますか。私はあなたがのstageXおよびstageYという性質をしたいと考えて: http://www.adobe.com/livedocs/フレックス/ 3 / langref /フラッシュ/イベント/ MouseEvent.htmlする
// This function adds or deletes an event listener
function listentoButton (isTrue:int, position_x:int, position_y:int):void {
if (isTrue == 1) {
this["button_position_"+(position_x)+"_"+(position_y)].addEventListener(MouseEvent.CLICK, myFunction);
} else {
this["button_position_"+(position_x)+"_"+(position_y)].removeEventListener(MouseEvent.CLICK, myFunction);
}
}
function myFunction(eventArg:MouseEvent):void {
//use MouseEvent
};
それとも、あなたが希望、あなたがイベントを削除するために行くとき、後で座標情報を、そのクラスの新しいインスタンスを作成し、x、y座標でインデックス化コレクションに追加し、保持するために、少しMyFunctionParametersクラスを作成することができますxおよびy座標に基づいて、コレクション内MySpaceParametersインスタンスを検索し、機能を削除するためにそれを使用します。
class MyFunctionParameters
{
public x:int;
public y:int;
function myFunction(eventArg:MouseEvent):void {
userClickedPosition(x,y);
};
}