0

私の問題は次のとおりです。

ダイナミック テキスト ボックス (text_txt) と基本的な背景の四角形を含むムービークリップで構成されるメニューがあります。

インスタンス名 (item1_mc など) で定義された各アイテムに、すべてのアイテム名を配列に入れてループすることにより、MouseEvent.CLICK のイベント リスナーを割り当てました。

var menuItemsArray:Array = [item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12];

for(var i:int = 0; i < menuItemsArray.length; i++){
    menuItemsArray[i].text_txt.text = labelArray[i];
    menuItemsArray[i].addEventListener(MouseEvent.CLICK, menuItem_click);
}

...そして、次を使用して、どちらが押されているかを判断します (そして、テキストを取り除きます)。

function menuItem_click(e:MouseEvent){
    unit_name = e.target.text;
    }

...そして、MovieClip 内の TextField を直接クリックすると (テキストが返されます)、すべて正常に動作しますが、MovieClip の縁 (および動的テキスト ボックスの領域の外側) をクリックすると、エラー #2007 が返されます。テキストを含まない [object menuItem_button_23] からテキストを取得しようとしたためです。

理想的には、MovieClip の「ボタン」をクリックした場所に関係なく、テキストが引っ張られますが、e.currentTarget、e.target、および両方と .text の組み合わせなどを試しました。 、 .text_txt.text など - しかし、すべてが外側に沿って「デッド」ゾーンを持つという同じ問題で終わります。

さらに、本質的に私がやろうとしているのは、ラベル テキストを含む配列によって (内部テキスト フィールドを介して) ラベル付けされた MovieClip 'ボタン' のメニューを作成することです。次に、ボタンをクリックすると、どちらが押されているかを判断し、ラベルを取得して、ラベルテキストに関連する詳細情報にアクセスできるようにします。

誰かが解決策、または私がやろうとしていることのより良い方法を持っているなら、私はすべて耳にします。私の AS3 の経験/知識はせいぜい平均的なものであり、私がやろうとしていることを達成するためにいくつかの新しいテクニックを学びたいと思っています. 必要に応じて、さらに情報を提供することもできます。

ありがとう!

4

3 に答える 3

0

32bitkidのリクエストで、以前のコメントを回答として投稿しています。

e.currentTargetを使用してみてください。e.targetを使用すると、CLICKイベントが発生したディスプレイリストの元のアイテムが取得されます。CLICKはバブリングイベントであるため、参照しているMovieClipではなく、MovieClipの内部オブジェクトになることがよくあります(したがって、e.targetは、実際にTextFieldをクリックしたときにのみ例で機能します)。e.currentTargetを使用する場合、実行しているのは、イベントを追加したオブジェクト(この場合は外部のMovieClip)を取得することなのでe.currentTarget.text_txt.text、トリックを実行する必要があります...

于 2012-10-07T18:24:23.613 に答える
0

ターゲットが実際に TextField であるかどうかを確認する必要があります。そうでない場合は、内部の text_txt を参照する必要があります。

function menuItem_click(e:MouseEvent){
    if (e.target is TextField) unit_name = e.target.text;
    else {
        if (e.target.text_txt) unit_name=e.target.text_txt.text; 
        else unit_name='';
    }
}

これは最初に、イベントの実際のターゲットが何であるかを確認します。それが TextField の場合は、それをクリックしたので、そのテキストを取得しましょう。そうでない場合は、ムービークリップである必要があります。「text_txt」プロパティが割り当てられているかどうかを確認します。割り当てられている場合は TextField になるため、そこからテキストを取得します。

于 2012-10-07T05:42:58.553 に答える
0

できることはmouseChildren、ムービークリップをオフにして、入れ子になっているテキスト フィールドのテキストを読み書きするために getter/setter ペアを定義することです。

Flash のライブラリにある MovieClip で、次のコードをクリップのレイヤーの 1 つに書き込みます。

this.mouseChildren = false;

function get text():String { return text_txt.text; }
function set text(value:String):void { text_txt.text = value; }

最初の行は、ムービークリップの子がマウス イベントのターゲットになることを無効にし、ムービークリップの表示領域のどこかをクリックするclickと、そのtargetプロパティがムービークリップに設定された -event がトリガーされます。これにより、イベントを処理する方法が統一されます。

getter/setter ペアは、テキスト フィールド プロパティへのアクセスをカプセル化するため、ムービークリップの外部からtext読み書きする必要はありません。text_txt

イベントリスナーは期待どおりに見えるはずです

function menuItem_click(e:MouseEvent):void {
    unit_name = e.target.text;
}

text_txtまた、この方法を使用すると、初期化中に直接アクセスする必要がなくなります。for ループを少し単純化して、次のように書くことができます。

for(var i:int = 0; i < menuItemsArray.length; i++){
    menuItemsArray[i].text = labelArray[i];
    menuItemsArray[i].addEventListener(MouseEvent.CLICK, menuItem_click);
}

これがあなたのニーズに最も適したソリューションであることを願っています. 何か問題がある場合、または何かを忘れた場合は教えてください。;)

于 2012-10-07T09:39:36.993 に答える