Comunidad de diseño web y desarrollo en internet online

Problema con carga de .swf

Citar            
MensajeEscrito el 21 Oct 2013 11:11 am
Buenas a todos,

terminé una aplicación y quiero hacer una pantalla de inicio para que desde allí dandole a un botón me cargue el .swf donde tengo la aplicación (esta en un .as asociado al .fla).

He probado de varias maneras pero después que me cargue la pantalla no se como hacer para que reconozca la pulsación del botón y se cargue la aplicación. He escrito un código simplificado para hacer pruebas de el método que estoy intentando. Consiste en una clase que extiende la clase EventDispatcher para poder comunicar con un evento la clase de la pantalla de inicio con la de la aplicación a cargar, la clase principal en el archivo .fla tiene un MC que cubre toda la pantalla que es donde cargo la pantalla de inicio.

Pongo los archivos de código a continuación, estaria muy agradecido si alguien pudiera darme alguna pista para poder hacer que funcione.

package {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.*;




public class PruebaLoaderPrincipal extends MovieClip {
var mi_cargador:Loader = new Loader();
var dispatcher:CustomDispatcher = new CustomDispatcher(); //crea instancia de CustomDispatcher
//////////////////7 Clase Principal /////////////
/////// el .fla tiene un circulo que se puede arrastrar //////////////////

public function PruebaLoaderPrincipal() {
// constructor code

var mi_ruta:URLRequest = new URLRequest("PruebaLoader.swf");

mi_cargador.load(mi_ruta);
pantalla.visible = true;

mi_cargador.contentLoaderInfo.addEventListener(Event.COMPLETE, pantallaCargada);
//mi_cargador.addEventListener(MouseEvent.CLICK, actionHandler);


//IniciaTodo();

}

function pantallaCargada(e:Event)
{
addChild(mi_cargador);

}

function actionHandler(event:MouseEvent):void {
var loader:Loader = Loader(event.target);
loader.unload();

}

function IniciaTodo()
{
pelota.addEventListener(MouseEvent.MOUSE_DOWN,arrastrarHandler);
pelota.addEventListener(MouseEvent.MOUSE_UP,soltarHandler);
}

function arrastrarHandler(e:MouseEvent):void
{
pelota.startDrag();
}

function soltarHandler(e:MouseEvent):void
{
pelota.stopDrag();
}
}

}

/////////// Clase con la pantalla de inicio //////////////////////////////////////
/////////// contiene un título y un botón /////////////////////////////////////

package {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.EventDispatcher;


public class PruebaLoader extends MovieClip {
var dispatcher:CustomDispatcher = new CustomDispatcher(); //crea instancia de CustomDispatcher

public function PruebaLoader() {
// constructor code

BotonEntrar.addEventListener(MouseEvent.CLICK, EntrarHandler);

}


function EntrarHandler(e:MouseEvent)
{
trace("Ha entrado en ENTRARHANDLER");
dispatcher.doAction();
}


}

}

////////// Clase que exiende EventDispatcher ///////////////////////////////////////////
//////////// Crea un evento ACTION que deberia poderse detectar desde las otras clases ////////////

package {

import flash.events.EventDispatcher;
import flash.events.Event;

class CustomDispatcher extends EventDispatcher
{
public static var ACTION:String = "action";

public function doAction():void
{
dispatchEvent(new Event(CustomDispatcher.ACTION));
trace("Se ejecuta doAction en la clase CustomDispatcher");

Por Chukychess

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Oct 2013 12:23 pm
BuenAS:

Creo que el problema está en que el constructor de CustomDispatcher debería ser algo así:

Código ActionScript :

public function CustomDispatcher(target:IEventDispatcher=null)
{
   super(target);
}


Cuando creas un distribuidor de eventos personalizado (una clase que extiende EventDispatcher) tienes que pasarle una instancia de un símbolo QUE ESTÉ EN LA LISTA DE VISUALIZACIÓN, ya que los eventos en AS3 DEPENDEN de la lista de visualización.

Cuando crees un constructor de este tipo verás que te va a pedir un símbolo; o sea, tendrás un código de este tipo:

Código ActionScript :


var myCustomDispatcher:CustomDispatcher = new CustomDispatcher(movie);



El símbolo movie DEBE estar en la la lista de visualización y él o sus padres van a poder oir el evento que distribuyas. Otros simbolos que no estén vinculados jerárquicamente a él no van a poder escuchar el evento. Cuidado con esto.

Incluso, si estas probando, cuando distribuyas el evento pasa el valor bobbles = true, esto hace que el evento burbujee y puedas capturarlo desde elementos jerarquicamente superiores.

Por otro lado, a mi no me gusta nada conectar clases con eventos, precisamente por esto (dependes de la lista de visualización; o sea, que el símbolo esté en la lista de visualización y vinculado jerárquicamente). Podias mirarte la librería Signals que evita todo esto.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 23 Oct 2013 11:04 pm
Grácias por la respuesta, mis conocimientos de AS3 son bastante limitados y no entiendo muy bien como aplicar tu explicación.

Te pongo el ejemplo en el que me vaso que intento reproducir.

En el ejemplo siguiente, se utilizan las clases EventDispatcherExample y CustomDispatcher, una subclase de EventDispatcher, para mostrar cómo se crea y se distribuye un evento personalizado. El ejemplo realiza las siguientes tareas:

El constructor de EventDispatcherExample crea una variable local dispatcher y la asigna a una nueva instancia de CustomDispatcher.
Dentro de CustomDispatcher se define una cadena para que el evento se llame action y se declara el método doAction(). Cuando se llama, este método crea el evento action y lo distribuye utilizando EventDispatcher.dispatchEvent().
La propiedad dispatcher se utiliza para añadir el detector de eventos action y un método suscriptor asociado actionHandler(), que simplemente imprime la información sobre el evento cuando se distribuye.
Se invoca el método doAction(), que distribuye el evento action.

package {
import flash.display.Sprite;
import flash.events.Event;

public class EventDispatcherExample extends Sprite {

public function EventDispatcherExample() {
var dispatcher:CustomDispatcher = new CustomDispatcher();
dispatcher.addEventListener(CustomDispatcher.ACTION, actionHandler);
dispatcher.doAction();
}

private function actionHandler(event:Event):void {
trace("actionHandler: " + event);
}
}
}

import flash.events.EventDispatcher;
import flash.events.Event;

class CustomDispatcher extends EventDispatcher {
public static var ACTION:String = "action";

public function doAction():void {
dispatchEvent(new Event(CustomDispatcher.ACTION));
}
}

Por Chukychess

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Oct 2013 09:40 am
BuenAS:

Tal como lo estás haciendo es perfecto. El único problema es que dispatcher va a ser el único objeto al que CustomDispatcher va a notificar los eventos que distribuya. Pero si te vale así, como digo, no hay mayor problema.

Muchas veces el objeto que distribuye el evento es uno y te interesa que haya otros objetos de la lista de visualización que puedan capturarlo, de ahí mi primer comentario.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.