2

更新:私の質問をよりよく反映するようにタイトルを変更しました

みなさん、こんにちは:)

今日の私の質問は、あるサブクラスから別のサブクラスに送信しようとしている CustomEvent を中心に展開しています。

CustomEvent クラスを使用して、サブ クラスからメイン クラスにイベントを渡すことができましたが、サブ クラス間で誰がそれを行うべきかわかりません。

カスタム イベント クラス

package src.events {
import flash.events.Event;

public class CustomEvent extends Event 
{
    public static const CHANGE:String="onChange";
    public static const COMPLETE:String="onComplete";
    public static const IMAGE_LOADED:String="onImageLoaded";
    public static const SWF_LOADED:String="onSWFLoaded";
    public static const SWF_UNLOAD:String="onSWFUnload";
    public static const CLICK:String="onClick";
    public static const PAUSE_MOVIE:String="onPause";
    public static const INTRO_CLICKED:String="introClicked";

    public var params:Object;

    public function CustomEvent(type:String, params:Object, bubbles:Boolean = false, cancelable:Boolean = false)
    {
        super(type, bubbles, cancelable);
        this.params=params;
    }

    public override function clone():Event 
    {
        return new CustomEvent(type, this.params, bubbles, cancelable);
    }

    public override function toString():String 
    {
        return formatToString("CustomEvent","params","type","bubbles","cancelable");
    }

}

サブクラス INTRO - ディスパッチ イベント

package src.display {

import gs.easing.*;
import gs.TweenLite;
import flash.text.*;
import flash.events.*;
import flash.display.*;
import flash.geom.Matrix;
import flash.geom.ColorTransform;

// ☼ ----------------------------------------- Imported Custom Classes
import src.events.CustomEvent;

// ☼ ----------------------------------------- Intro Class
public class Intro extends Sprite 
{
    private var playBtn:MovieClip;

    // ☼ ----------------------------------------- Constructor
    public function Intro():void 
    {
        this.addEventListener(Event.ADDED_TO_STAGE, init);
    }

    // ☼ ----------------------------------------- Init
    public function init(event:Event):void 
    {
        draw();
    }

    public function draw():void 
    {           
        playBtn = new PlayThumb;
        playBtn.buttonMode = true;
        playBtn.x = 582;
        playBtn.y = 259;
        playBtn.alpha = 1;

        addChild(playBtn);

        playBtn.addEventListener(MouseEvent.MOUSE_UP, clicked);
    }

    private function clicked(e:MouseEvent):void 
    {
        trace("clicked big play");
        dispatchEvent (new CustomEvent(CustomEvent.INTRO_CLICKED, {}));
        trace("event = "+CustomEvent.INTRO_CLICKED);
    }

}

サブクラス NAVIGATION - イベントをリッスンしている場所 Navigation クラス内でこの関数を呼び出す必要があります。

function introPlayButtonClick(e:CustomEvent):void
        {
            trace("introPlayButtonClick called");

            TweenLite.to(buttons[0], 1, {y:20, ease:Strong.easeOut});
            TweenLite.to(buttons[1], 1, {y:navBtnY, ease:Strong.easeOut});
            TweenLite.to(introTab, 1, {y:60, ease:Strong.easeOut});
            TweenLite.to(scrollerMov, 1, {y:60, ease:Strong.easeOut});
            $btn1 = true;
            $btn2 = false;

            trace("introPlayButtonClick called --- end");
        }

わかりましたので、私の問題はナビゲーション クラスにあると思います。ここに addEventListener を正しく追加するにはどうすればよいですか? introPlayButtonClick 関数でトレースを取得できません。

PAUSE_MOVIE イベントを使用して Main クラスでどのように機能したかは、変数名 nv を介して eventListener を Navigation クラスにアタッチした場合です。

nv.addEventListener("onPause", pauseMovie); // Inside of MAIN class

しかし、INTRO_CLICKED イベントの Navigation クラス内にイベント リスナーを追加しているので、 (これを)追加するだけで十分だと思いましたが、これまでのところ、そのイベントをトリガーすることはできません。

アイデア、ヒント、考えはありますか?

4

3 に答える 3

3

リスナーは、任意のイベントをディスパッチするクラスのインスタンスにアタッチされているため、Navigationクラスのインスタンス内のIntroオブジェクトからイベントをリッスンするには、そのIntroオブジェクトに「addEventListener」する必要があります。つまり、参照が必要です。アタッチするIntroクラスのインスタンスに。

より詳細な答えを与えるためにあなたのセットアップについて十分に知らないので、ここに一般的な考えの実例となる小さな例があります:

public class Navigation extends WhateverClassYourSubClassing
{
    public var intro:Intro;

    public function attachListenerForIntro(introToCheckForClick:Intro){
         intro = introToCheckForClick;
         intro.addEventListener("onIntro", introPlayButtonClick);
    }

    public function introPlayButtonClick(e:CustomEvent):void
    {
        trace("introPlayButtonClick called");

        TweenLite.to(buttons[0], 1, {y:20, ease:Strong.easeOut});
        TweenLite.to(buttons[1], 1, {y:navBtnY, ease:Strong.easeOut});
        TweenLite.to(tabNum1, 1, {y:60, ease:Strong.easeOut});
        TweenLite.to(scrollerMov, 1, {y:60, ease:Strong.easeOut});
        $btn1 = true;
        $btn2 = false;
        trace("introPlayButtonClick called --- end");
        intro.removeEventListener("onIntro", introPlayButtonClick);
    }
}

編集:コメントに基づいて更新された例:

したがって、ナビゲーションオブジェクトのイベントハンドラ関数を指すイントロオブジェクトにイベントリスナーをアタッチする必要があります。したがって、メインクラスでこれらの両方への参照がある場合は、次のようにします。

var navigator:Navigator;
var intro:Intro;

intro.addEventListener("onIntro", navigator.introPlayButtonClick);

したがって、Navigationクラス内から、Introクラスを参照して、attachListenerForIntro関数のポイントであるイベントリスナーをアタッチする必要があります。したがって、メインクラスから、NavigationインスタンスだけでなくIntroへの参照もあると思います。メインクラスにvarnv:Navigationのようなものがある場合。var intr:Intro;

于 2009-10-28T17:37:26.343 に答える
2

イベントディスパッチャーを使用する代わりに、関数を直接呼び出そうとしていたクラスを参照できるように、public static varを使用しました。

最初の部分: ナビゲーション クラス

public class Navigation extends MovieClip
{
    private var // where I put many private vars
    private var intro:Intro;
    public var // where I put many public vars
    public static var instance:Navigation;


    // ☼ --------------------------------- Constructor
    public function Navigation():void
    {
        instance = this; //<- so I can reference this Class from another
        //other code

イントロ クラスボタン アクション:

private function clicked(e:MouseEvent):void 
    {
        trace("clicked play -> launch function in Navigation");
        Navigation.instance.introPlayButtonClick(); //Class targeted
    }

これで、 Introクラス内から、 Navigationクラスでこの関数を呼び出すことができます。

public function introPlayButtonClick():void
    {               
        TweenLite.to(buttons[0], 1, {y:20, ease:Strong.easeOut});
        TweenLite.to(buttons[1], 1, {y:navBtnY, ease:Strong.easeOut});
        TweenLite.to(introTab, 1, {y:60, ease:Strong.easeOut});
        TweenLite.to(scrollerMov, 1, {y:60, ease:Strong.easeOut});
        $btn1 = true;
        $btn2 = false;
    }
于 2009-10-28T21:12:32.820 に答える
1

これは私の問題を解決します、見てください.. :),,

" http://greenethumb.com/article/23/understanding-root-and-the-document-class-in-as3 "

于 2011-01-27T06:17:40.887 に答える