Comunidad de diseño web y desarrollo en internet online

como hacer para cargar un archivo plano a un SWF en AS3

Citar            
MensajeEscrito el 15 Abr 2010 05:50 am
Hola Cristalab, soy nuevo y estoy aprendiendo a programar AS3, y quiero hacer lo siguiente:

Como hago para que en un swf con el Texfield cargue un archivo plano en extension txt (Dentro del archivo plano muestra una lista de los enlaces con event [<a href="event:micarpeta/mianimacion.swf,cargaArchivo">enlace a foto o swf</a>] ), al cargar el archivo plano dentro del swf, al dar click en uno de los enlaces mostrados del archivo plano, me cargue un swf externo.

En realidad, lo que quiero hacer es cargar un swf externo por medio de la lista de enlaces que será cargados con el archivo plano .txt, entonces como hago para que haga este evento de cargar un swf externo ?

Aqui dejo lo que he hecho, claro que es necesario modificar algo:

Código en AS3

// En esta linea es la importacion de clases necesarias.

var loader:URLLoader=new URLLoader();
loader.dataFormat=URLLoaderDataFormat.VARIABLES;
loader.load(new URLRequest("texts.txt"));
loader.addEventListener(Event.COMPLETE,carga);
loader.addEventListener(Event.COMPLETE,cargaArchivo);

function carga(event:Event) {
cargatexto.htmlText = (loader.data.miVariable);
}

cargatexto.addEventListener(TextEvent.LINK, cargaArchivo) ;

function cargaArchivo(evt:TextEvent):void{
trace("El argumento pasado es "+evt.text);
addChild(escena_mc);
}

Este codigo si me carga el archivo plano y me muestra los enlaces, pero al dar click mo me carga un swf externo sino la salida en texto con el 'trace'. Como hago para que me cargue un swf externo con enlaces cargados desde un txt ?

Muchas Gracias ...

Por famq23

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Abr 2010 06:36 am
Francisco, tienes que cambiar tu función "cargaArchivo". Lo suyo es que crees un nuevo loader al principio

Código ActionScript :

//Añades al principio
var contenedor:Loader=new Loader()
addChild(contenedor)

Luego, tu función queda como

Código ActionScript :

function cargaArchivo(evt:TextEvent):void{
//trace("El argumento pasado es "+evt.text);
   contenedor.load(new URLRequest(evt.text))
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Abr 2010 08:51 pm
Muchas Gracias Eliseo2 por la ayuda, el código que me mostraste si funciona, osea si me carga un swf externo o una foto al dar click a un enlace desde un archivo plano .txt, pero al dar click a uno de los enlaces, carga el swf externo en la pelicula y tapa la lista de los enlaces, en vez de mostar un swf externo al lado de los enlaces, puede ser un Movie Clip vacio.

Y estuve intentando para que me mostrara un swf externo en un Movie Clip vacio que queda al lado de los enlaces para que no me tape, pero nada ... el movie clip se llama 'escena_mc'

Aqui dejo el Código en AS3 completo:

----------------------------------------------------------------------------------------------------
//Importo las clases necesarias
import flash.display.Loader;
import flash.net.URLLoader;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequest;

var contenedor:Loader=new Loader() ;
addChild(contenedor);
var loader:URLLoader=new URLLoader();
loader.dataFormat=URLLoaderDataFormat.VARIABLES;
loader.load(new URLRequest("texts.txt"));
loader.addEventListener(Event.COMPLETE,carga);
loader.addEventListener(Event.COMPLETE,cargaArchivo);

//Funcion que carga un archivo plano en .txt
function carga(event:Event) {
cargatexto.htmlText = (loader.data.miVariable);
}
//Funcion que carga un swf externo o una foto externa.
function cargaArchivo(evt:TextEvent):void {
contenedor.load(new URLRequest(evt.text));
}
cargatexto.addEventListener(TextEvent.LINK,cargaArchivo);

----------------------------------------------------------------------------------------------------
La pregunta es: Cómo hago para que me muestre un swf externo en un Movie CLip vacio que queda al lado de los enlaces ? el movie clip vacio se llama "escena_mc"

Y Otra pregunta: Para cargar un archivo en XML que muestra los enlaces, este código servirá ?

Muchas Gracias ...

Por famq23

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Abr 2010 07:23 am
Un objeto de tipo Loader extiende de DisplayObject, con lo que tiene propiedades x e y que podemos cambiar

Código ActionScript :

contenedor.x=300 //<--por ejemplo

Aún así, al añadirlo con un addChild se añadirá en una "depth" superior a todo lo que tengamos en pantalla. Podríamos usar

Código ActionScript :

addChildAt(contenedor,0)

Para que lo añadiera en la "parte más baja". Pero la parte más baja es siempre más alta que TODO lo que tengamos en el stage en tiempo de diseño.
Frente a este problema, podemos, o bien hacer un swapChildren con algo que tuviéramos en el stage

Código ActionScript :

swapChildren(contenedor,un_mc_inferior)

O tomar la estrategia de crear un MC vacío en tiempo de diseño, ponerlo en la capa más baja, darle como nombre de instancia, p.e. "escena_mc" y añadir el loader en dicho MC

Código ActionScript :

escena_mc.addChild(contenedor)

Vale, el "problema" de hacer esto es que al final vamos a acabar con una esctructura tal y como

Código :

root
  |-----escena_mc (nuestro MC vacío)
              |---contenedor (nuestro Loader)
                         |----content (pelicula.swf) 

Si no nos molesta no pasa nada, si lo que queremos es que la película esté sobre "escena_mc" (nuestro MC vacío) debemos añadir un listener a nuestro Loader, y, cuando se halla cargado la película añadir el content del Loader a "contenido". Puff, a ver si en código lo explico mejor

Código ActionScript :

var contenedor:Loader = new Loader();
//Añadimos un listener a contenedor
//¡¡ojo, no hacemos ningún addChild de "contenedor"
contenedor.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
private function initHandler(event:Event):void {
      var loader:Loader = Loader(event.target.loader); //<--recogemos el loader
      escena_mc.addChild(loader.content) //<---añadimos a nuestro MC vacío
                                             //<--el "content" del loader
}



Para cargar un archivo en XML que muestra los enlaces, este código servirá ?

El problema es, en base al fichero XML crear un "texto" para hacer el

Código ActionScript :

cargatexto.htmlText = (loader.data.miVariable); //<--esto lo tendríamos que cambiar

Depende de cómo crees el XML será más o menos fácil

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2010 07:03 am
Muchas Gracias Eliseo2 por la nueva respuesta, sencillamente puse el nombre del movie clip vacio (escena_mc) antes de addChild(contenedor), y ahora si me muestra una foto o un swf externo al lado de la lista en un movie clip vacio.
Más abajo hay unas preguntas, por ahora muestro el código completo en AS3 y funcionando:

Código en AS3:

//Importo las clases necesarias
import flash.display.Loader;
import flash.net.URLLoader;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequest;

var contenedor:Loader=new Loader() ;

escena_mc.addChild(contenedor); // <-- Carga un swf externo en un Movie Clip vacio.

var loader:URLLoader=new URLLoader();
loader.dataFormat=URLLoaderDataFormat.VARIABLES;
loader.load(new URLRequest("texts.txt"));
loader.addEventListener(Event.COMPLETE,carga);
loader.addEventListener(Event.COMPLETE,cargaArchivo);

//Funcion que carga un archivo plano en .txt
function carga(event:Event) {
cargatexto.htmlText = (loader.data.miVariable);
}
//Funcion que carga un swf o un jpg externa desde un archivo plano .txt
function cargaArchivo(evt:TextEvent):void {
contenedor.load(new URLRequest(evt.text));
}
cargatexto.addEventListener(TextEvent.LINK,cargaArchivo);

Si esta funcionando, pero sale como una advertancia en la salida del compilador, donde al hacer un 'trace muestra ahi en la salida', y es ese, pero no es nada grave:
--------------------------------------------------------------------------------------------
TypeError: Error #1034: Error de conversión forzada: no se puede convertir flash.events::Event@4db9b51 en flash.events.TextEvent.
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/flash.net:URLLoader::onComplete()
--------------------------------------------------------------------------------------------
Cómo cuadrar el error ó la advertencia ? porque al dar click al archivo swf también sale este errorcito.

-------------------------------------------
Ahora, estoy haciendo para cargar un swf externo con un XML, igualito al anterior que es con un .txt, y no he logrado que me muestre los datos de un XML en un SWF principal (en un text Area), pero si en la salida con un 'trace', en el archivo XML lo tengo asi: el nombre del XML es: cargadatos.xml

-----------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="ISO-8859-15" ?>
<datos>
<info>
<![CDATA[listas de imagenes externas a cargar:<br> <a href="Event:imagenes/foto1.jpg">Cargar Foto 1</a><a href="Event:imagenes/foto2.jpg">Cargar Foto 2</a> <br>
Listas de SWF externas a cargar: <br> <a href="Event:swf/mi_swf1.swf">Cargar SWF 1</a><a href="Event:swf/mi_swf1.swf">Cargar SWF 2</a> ]]>
</info>
</datos>
--------------------------------------------------------------------------------------------------

Y el Código en AS3 para cargar un swf ó un jpg externo con el XML

//Importo las clases necesarias
import flash.display.Loader;
import flash.net.URLLoader;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequest;

var contenedor:Loader=new Loader() ;

escena_mc.addChild(contenedor); // <-- Carga un swf en un Movie Clip vacio.
//contenedor.contentLoaderInfo.addEventListener(Event.INIT,initHandler);

var loader:URLLoader=new URLLoader();
loader.dataFormat=URLLoaderDataFormat.VARIABLES;
loader.load(new URLRequest("cargadatos.xml"));
loader.addEventListener(Event.COMPLETE,carga);
loader.addEventListener(Event.COMPLETE,cargaArchivo);

//Funcion que carga un archivo en .xml
function carga(event:Event):void {
var myXML:XML = new XML(event.target.data);
//cargatexto.htmlText = (loader.data.miVariable);
trace(myXML); //<-- por el momento me muestra el XML en la salida, pero no en el SWF principal.
}
//Funcion que carga una imagen ó swf externo desde un .xml
function cargaArchivo(evt:TextEvent):void {
contenedor.load(new URLRequest(evt.text));
}

cargatexto.addEventListener(TextEvent.LINK,cargaArchivo);


Entonces como hago para que me carge el XML en un SWF principal (Mostrando la lista de los enlaces) y que al dar click en uno de los enlaces, carga un swf o un imagen externa ?

Muchas Gracias ... :)

Por famq23

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Abr 2010 08:02 am

famq23 escribió:

Si esta funcionando, pero sale como una advertancia en la salida del compilador, donde al hacer un 'trace muestra ahi en la salida', y es ese, pero no es nada grave:
--------------------------------------------------------------------------------------------
TypeError: Error #1034: Error de conversión forzada: no se puede convertir flash.events::Event@4db9b51 en flash.events.TextEvent.

Cuando añadimos un listener, el argumento de la función DEBE ser del mismo tipo que el evento. Vamos, tienes dos eventos, uno que es cuando "clickamos el enlace" otro cuando se completa el loader.
Te sobra cuando se completa el loader que carga

Código ActionScript :

//TIENES
loader.addEventListener(Event.COMPLETE,cargaArchivo);
cargatexto.addEventListener(TextEvent.LINK,cargaArchivo);

SOBRA el listener sobre el loader, o, si quieres saber cuándo ha acabado de cargar, debes crear OTRA función

Código ActionScript :

loader.addEventListener(Event.COMPLETE,cargaPelicula);
function cargaPelicula(evt:Event){   //<---el argumento es de tipo Event
           ....
}

famq23 escribió:


Ahora, estoy haciendo para cargar un swf externo con un XML, igualito al anterior que es con un .txt, y no he logrado que me muestre los datos de un XML en un SWF principal (en un text Area), pero si en la salida con un 'trace', en el archivo XML lo tengo asi: el nombre del XML es: cargadatos.xml

Es que no puedes igualar directamente la propiedad htmlText al XML lo tendrás que igualar, creo(*), a

Código ActionScript :

cargatexto.htmlText=myXML.info.toString()


(*)Es que, yo con los XML siempre tengo que hacer ensayo de "prueba y error". y no sé si será
myXML.info[0].toString() u otra cosa
Kirupa tiene un buen tutorial en inglés sobre XML

Por Eliseo2

710 de clabLevel



 

firefox

 

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