2

そのため、コンテナー ムービークリップ内に 65 個のムービークリップを生成しました。(これはゲーム上にあるためコンテナー内にあり、ポップアップ内にあります。) MovieClip は、ライブラリ内の AS3 リンクされた MovieClip にアクセスすることによって作成されます。それぞれが MovieClip の配列に格納されます。そこから、いくつかのテキスト情報 (隠しテキストを含む) をそれぞれに入れ、いくつかのイベント リスナーを追加します。コード自体は、1 つのことを除いて問題なく動作します。イベント リスナーは、ムービークリップ自体ではなく、ムービークリップ内の TextField の 1 つとしてターゲットを受け取ります。マウス イベント リスナーがムービークリップに適用されていることを確認しました。

for (var i:int = 0; i < mcArray.length; i++)
{
    mcArray[i] = new IDButton();
    MovieClip(mcArray[i]).tf1.text = String(ID1[i])
    MovieClip(mcArray[i]).tf2.text = String(ID2[i]);
    MovieClip(mcArray[i]).tf3.text = String(ID3[i]);
    MovieClip(mcArray[i]).tf1.selectable = false;
    MovieClip(mcArray[i]).tf2.selectable = false;
    MovieClip(mcArray[i]).tf3.selectable = false;
    MovieClip(mcArray[i]).tf1.visible = false;
    MovieClip(mcArray[i]).tf2.visible = false;
    MovieClip(mcArray[i]).name = "MC" + String(i);
    container.addChild(MovieClip(mcArray[i]));
    MovieClip(mcArray[i]).addEventListener(MouseEvent.CLICK, mcClickHandler);
    MovieClip(mcArray[i]).addEventListener(MouseEvent.ROLL_OVER, mcHoverHandler);
    MovieClip(mcArray[i]).addEventListener(MouseEvent.ROLL_OUT, mcOffHandler);
    MovieClip(mcArray[i]).x = 0;
    MovieClip(mcArray[i]).y = MovieClip(mcArray[i]).height * i;
}

(正直に言うと、MovieClip が冗長であるかどうかはわかりません。これは、フラッシュに対する私の一般的な信頼の欠如を示していると思います。)

テストするために、mcClickHandler 関数でターゲット名をトレースしたところ、「tf3」が返され続けました。

4

3 に答える 3

4

AS3 のイベントには、 と の 2 つの「ターゲット」プロパティがtargetありcurrentTargetます。一方が機能しない場合、通常はもう一方が機能します。

基本的に、targetはマウスがクリックした実際currentTargetのオブジェクトであり、リスナーがアタッチされているオブジェクトです。

この SO の質問の詳細: e.target と e.currentTarget の違い

于 2012-06-12T06:25:39.893 に答える
1

mouseChildrenを次のように設定してみてくださいfalse:

MovieClip(mcArray[i]).mouseChildren = false;
于 2012-06-12T06:29:09.390 に答える
0

もっとシンプルなバージョンを選びます。イベントリスナーを1つだけ追加し、それを使用Event.targetして(コンテナー内の)どのアイテムがクリックされたかを判別します。その型(クラス)を賢く利用することができます。すべてのボタンがと呼ばれるカスタムクラスを拡張しIDButton、それらすべてが同じことを行う必要があるとしましょう(関数の呼び出しなど)が、そのIDに基づくパラメーターを使用します。

これは、ボタンが基本的に同じことを行う必要があり、同じコンテナ内に同じマウスイベントをリッスンする必要のある他のタイプのクリップがあまりない場合に役立ちます。

package  
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Test extends Sprite
    {
        public function Test()
        {
            // one listener for all clicks
            this.addEventListener(MouseEvent.CLICK, handleClick);
            this.addEventListener(MouseEvent.MOUSE_OVER, handleHover);
            this.addEventListener(MouseEvent.MOUSE_OUT, handleHover);
        }

        private function handleClick(event:MouseEvent):void
        {
            // you're need to be sure it's a IDButton
            if (event.target is IDButton)
            {
                var button:IDButton= event.target as IDButton; 
                this.showById(button.id); // let's say CustomButton has a public var 'id'
            }
        }

        private function showById(id:int):void
        {
            // do something
        }


        private function handleHover(event:Event):void
        {
            if (event.target is IDButton)
            {
                var button:IDButton = event.target as IDButton;
                switch (event.type)
                {
                    case MouseEvent.ROLL_OVER:
                    {
                        button.alpha = 0.8;
                        break;
                    }
                    case MouseEvent.ROLL_OUT:
                    {
                        button.alpha = 1;
                        break;
                    }
                }
            }
        }
    }
}

お役に立てば幸いです。

于 2012-06-12T10:45:15.130 に答える