flash - programacion - ¿Cómo llamar a una función en una clase de otra clase?
manual de programacion android pdf (3)
Actualización: título modificado para reflejar mejor mi pregunta
Hola a todos :)
Mi pregunta de hoy gira en torno a un CustomEvent que intento enviar de una subclase a otra.
He utilizado mi clase CustomEvent para pasar un evento de una clase secundaria a mi clase principal, pero no estoy seguro de quién hacer eso entre las clases secundarias.
Mi clase de evento personalizado
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 Clase INTRO - despacha evento
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);
}
}
Navegación de Sub Clase - donde estoy escuchando el evento Necesito llamar a esta función dentro de la clase de Navegación:
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, entonces creo que mi problema radica en la clase de navegación, ¿cómo agrego correctamente addEventListener aquí? No obtengo ninguno de los rastros en mi función introPlayButtonClick.
Cómo funcionaba en mi clase principal con el evento PAUSE_MOVIE, me adjuntaron el eventListener a la clase de navegación a través del nombre de la variable nv:
nv.addEventListener("onPause", pauseMovie); // Inside of MAIN class
Pero dado que estoy agregando el detector de eventos dentro de la clase de Navegación para el evento INTRO_CLICKED, pensé que todo lo que necesitaba era (esto.) Agregado, pero hasta ahora no estoy logrando que ese evento se dispare.
Alguna idea, consejos, pensamientos?
Utilicé var. Estáticas públicas para poder hacer referencia a la clase en la que estaba tratando de invocar directamente una función, en lugar de utilizar distribuidores de eventos.
Primera parte: clase de navegación
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
Acción del botón de clase de introducción :
private function clicked(e:MouseEvent):void
{
trace("clicked play -> launch function in Navigation");
Navigation.instance.introPlayButtonClick(); //Class targeted
}
Ahora puedo desde dentro de la clase de introducción , llamar a esta función en mi clase de navegación :
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;
}
los oyentes están conectados a una instancia de la clase que distribuye un evento dado, por lo que para escuchar el evento desde un objeto de introducción dentro de una instancia de la clase de navegación, necesitas ''addEventListener'' para ese objeto de introducción, lo que significa que necesitas una referencia a una instancia de la clase de introducción para adjuntar.
Al no saber lo suficiente sobre su configuración para dar una respuesta más detallada, aquí hay un pequeño ejemplo ilustrativo de la idea general:
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);
}
}
EDITAR: ejemplo actualizado basado en comentarios:
Por lo tanto, debe conectar el detector de eventos AL OBJETO INTRO que apunta a la función del controlador de eventos EN EL OBJETO DE NAVEGACIÓN. entonces, si tiene una referencia a ambos en su clase principal, haga algo como esto:
var navigator:Navigator;
var intro:Intro;
intro.addEventListener("onIntro", navigator.introPlayButtonClick);
Por lo tanto, desde la clase de navegación, debe hacer referencia a la clase de introducción para adjuntar el detector de eventos, que es el punto de la función attachListenerForIntro. Por lo tanto, desde su clase principal, supongo que tiene una referencia a la introducción, así como a las instancias de navegación. si en la clase principal tenías algo así como var nv: navegación; var intr: introducción;
Esto resuelve mi problema, eche un vistazo ..:) ,,
" http://greenethumb.com/article/23/understanding-root-and-the-document-class-in-as3 "