How to call a function in a Class from another Class?

我是研究僧i 提交于 2019-12-01 07:34:28

问题


Update: Modified title to better reflect my question

Hi everybody :)

My question today revolves around a CustomEvent I'm trying to send from one sub Class to another.

I've used my CustomEvent class to pass an event from a sub Class to my main class fine, but I'm not sure who to do that between sub classes.

My Custom Event Class

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

}

Sub Class INTRO - dispatches event

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

}

Sub Class NAVIGATION - where I'm listening for the event Need to call this function inside of the Navigation class:

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

Ok so I believe my problem lies in the Navigation Class, how do I correctly add the addEventListener here? I'm not getting any of the traces in my introPlayButtonClick function.

How it worked in my Main class with the PAUSE_MOVIE event, was I attached the eventListener to the Navigation class via the variable name nv:

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

But since I'm adding the event listener inside of the Navigation class for the INTRO_CLICKED event I thought all I needed was (this.) added, but so far I'm not getting that event to trigger.

Any ideas, tips, thoughts?


回答1:


listeners are attached to an instance of the class that dispatches any given event, so to listen for the event from an Intro object within an instance of the Navigation class, you need to 'addEventListener' to that Intro object, which means you need a reference to an instance of the Intro class to attach to.

Not knowing enough about your setup to give an more detailed answer, here's an illustrative little example of the general idea:

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

EDIT: updated example based on comments:

So you need to attach the event listener TO THE INTRO OBJECT that points to the event handler function IN THE NAVIGATION OBJECT. so if you have a reference to both of these in your main class, do something like this:

var navigator:Navigator;
var intro:Intro;

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

So from within the Navigation class, you need to reference the Intro class to attach the event listener, which is the point of the attachListenerForIntro function. So from your main class, I assume you have a reference to the Intro as well as the Navigation instances. if in the main class you had something like var nv:Navigation; var intr:Intro;




回答2:


I used public static var so I could reference the Class I was trying to call a function in directly, instead of using event dispatchers.

First part: Navigation class

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

Intro class button action:

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

Now I can from inside the Intro class, call this function in my Navigation class:

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



回答3:


This solves my problem , have a look .. : ),,

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



来源:https://stackoverflow.com/questions/1638537/how-to-call-a-function-in-a-class-from-another-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!