Как вызвать функцию в классе из другого класса?
Обновление: изменено название, чтобы лучше отражать мой вопрос
Всем привет:)
Мой вопрос сегодня вращается вокруг 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, я прикрепил eventListener к классу Navigation через имя переменной nv:
nv.addEventListener("onPause", pauseMovie); // Inside of MAIN class
Но так как я добавляю прослушиватель событий внутри класса Navigation для события INTRO_CLICKED, я думал, что все, что мне нужно, было (this.) Добавлено, но пока я не получаю это событие для запуска.
Есть идеи, советы, мысли?
3 ответа
Я использовал общедоступную статическую переменную 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;
}
Слушатели присоединяются к экземпляру класса, который отправляет любое данное событие, поэтому для прослушивания события из объекта Intro в экземпляре класса Navigation необходимо добавить 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);
}
}
РЕДАКТИРОВАТЬ: обновленный пример на основе комментариев:
Таким образом, вам нужно присоединить прослушиватель событий к ОБЪЕКТУ ВВЕДЕНИЯ, который указывает на функцию обработчика событий В ОБЪЕКТЕ НАВИГАЦИИ. так что если у вас есть ссылка на оба из них в вашем основном классе, сделайте что-то вроде этого:
var navigator:Navigator;
var intro:Intro;
intro.addEventListener("onIntro", navigator.introPlayButtonClick);
Таким образом, внутри класса Navigation вам нужно обратиться к классу Intro, чтобы присоединить прослушиватель событий, который является точкой функции attachListenerForIntro. Так что из вашего основного класса я предполагаю, что у вас есть ссылка на вступление, а также на экземпляры Navigation. если в основном классе у вас было что-то вроде var nv:Navigation; var intr:Intro;
Это решает мою проблему, посмотрите..:),,
" http://greenethumb.com/article/23/understanding-root-and-the-document-class-in-as3 "