如何从另一个类调用类中的函数?

时间:2009-10-28 16:48:38

标签: flash actionscript-3 events class dispatchevent

更新:修改标题以更好地反映我的问题

大家好嗨:)

今天我的问题围绕着一个我正试图从一个子类发送到另一个子类的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类中调用此函数:

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函数中获得任何痕迹。

如何在我的Main class 中使用PAUSE_MOVIE事件,我是通过变量名称nv将eventListener附加到Navigation类:

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

但是因为我在导航类中为INTRO_CLICKED事件添加了事件监听器,我认为我所需要的只是(这个。),但是到目前为止我还没有得到那个事件触发。

任何想法,提示,想法?

3 个答案:

答案 0 :(得分:3)

侦听器附加到调度任何给定事件的类的实例,因此要从Navigation类的实例中的Intro对象侦听事件,需要将“addEventListener”添加到该Intro对象,这意味着你需要引用要附加到的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);
    }
}

编辑:基于评论的更新示例:

因此,您需要将事件侦听器附加到指向导航对象中的事件处理函数的INTRO OBJECT。因此,如果您在主类中引用了这两个,请执行以下操作:

var navigator:Navigator;
var intro:Intro;

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

因此,在Navigation类中,您需要引用Intro类来附加事件侦听器,这是attachListenerForIntro函数的要点。因此,从您的主类,我假设您有对Intro和Navigation实例的引用。如果在主类中你有类似var nv:Navigation; var intr:简介;

答案 1 :(得分: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
    }

现在我可以在简介类中,在我的导航类中调用此函数:

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;
    }

答案 2 :(得分:1)