Comunidad de diseño web y desarrollo en internet online

Cargar swf externo con un boton en un menu

Citar            
MensajeEscrito el 08 Abr 2010 12:37 pm
Buenas antes que nada saludar que soi nuevo a pesar de lo mucho que he leido, vereis tengo un problema que me lleva de cabeza de hace un par de dias y por mucho que he leido y he mirado no consigo resolver, seguro que es basico y una tonteria pero esto del cambio a as3 me esta matando.

El caso es que tengo una escena, en la cual tengo unos botones, uno en cada capa para darle un efecto, bueno pues no consigo que al darle click a uno de esos botones cargue en un mc vacio el swf externo, cada seccion de la pagina la tengo en un swf, y cada swf quiero que se abra con su boton correspondiente, seguro que es facil pero a mi me puede mas de lo que puedo.

He probado esto:

var contenedor:MovieClip = new MovieClip();
var loader:Loader = new Loader();
loader.load(new URLRequest("donde.swf"));

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);

function insertMovie(evt:Event):void{

addChild(contenedor).name = "contenedorindex";
contenedor.addChild(loader).name = "loader";


Lo unico que consigo es que me cargue el swf dentro de contenedorindex, pero no se como hacer para que cargue cuando le des a su boton.

Gracias de antemano y un saludo.

Por selito

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Abr 2010 01:16 pm
Yo lo utilizo de esta manera y funciona perfectamente

function loadIntro():void
{
var loadIntro:Loader = new Loader;
loadIntro.contentLoaderInfo.addEventListener( Event.COMPLETE, introLoadedHandler );
loadIntro.load( new URLRequest( "intro.swf" ));
}

/**
* Evento que se dispara cuando se terminó de cargar el swf
* @param e
*/
function introLoadedHandler( e:Event ):void
{
var _intro:MovieClip = MovieClip( LoaderInfo( e.target ).content );
addChild( _intro );
}

Por pmolina88

74 de clabLevel



Genero:Masculino  

Ingeniero en Sistemas

firefox
Citar            
MensajeEscrito el 08 Abr 2010 01:25 pm
Ok, pero yo lo qu quiero no es que cargue con ese codigo, con ese codigo carga perfectamente, lo que no consigo es que al hacer click en el boton cargue el swf.

No quiero que el swf se vea asta que le des click al boton de la escena principal.

Por selito

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Abr 2010 03:53 pm
Nada, no consigo encontrar la funcion para cliquear el boton...

Por selito

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Abr 2010 05:00 pm
Selito, le tienes que añadir un listener a tu botón. Si supongo que tienes un botones, con nombre de instancia "boton1" debes escribir

Código ActionScript :

//TODAVÏA NO FUNCIONA
boton1.addEventListener(MouseEvent.CLICK,botonPulsado)
private function botonPulsado(e:MouseEvent){
   //Aquí todo tu código
   var contenedor:MovieClip = new MovieClip();
   var loader:Loader = new Loader();
   loader.load(new URLRequest("donde.swf"));

   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
}
function insertMovie(evt:Event):void{
   addChild(contenedor).name = "contenedorindex";
   contenedor.addChild(loader).name = "loader";
}
stop()

Vale, existe un problema y es que, ni contenedor ni loader tiene ningún valor DENTRO de la función "insertMovie". Eso es porque lo hemos declarado DENTRO de otra función, así que, declarémoslos fuera

Código ActionScript :

//declaramos las variables
var contenedor:MovieClip 
var loader:Loader 
//Nuestro listener
boton1.addEventListener(MouseEvent.CLICK,botonPulsado)
private function botonPulsado(e:MouseEvent){
   //Aquí simplemente les damos valor
   contenedor:MovieClip = new MovieClip();
   loader= new Loader();
   loader.load(new URLRequest("donde.swf"));
   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
}
function insertMovie(evt:Event):void{
   addChild(contenedor).name = "contenedorindex";
   contenedor.addChild(loader).name = "loader";
}

NOTAS:
NOTA1.-NO es necesario añadir un loader DENTRO de un contenedor, se puede añadir directamente al "stage"

Código ActionScript :

//declaramos las variables
var loader:Loader 
//Nuestro listener
boton1.addEventListener(MouseEvent.CLICK,botonPulsado)
private function botonPulsado(e:MouseEvent){
   //Aquí simplemente les damos valor
   loader= new Loader();
   loader.load(new URLRequest("donde.swf"));
   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
}
function insertMovie(evt:Event):void{
   addChild(loader).name = "loader";
}

NOTA2:Tampoco es necesario añadir el loader DESPUÉS de cargar la película

Código ActionScript :

//declaramos las variables
var loader:Loader 
//Nuestro listener
boton1.addEventListener(MouseEvent.CLICK,botonPulsado)
private function botonPulsado(e:MouseEvent){
   //Aquí simplemente les damos valor
   loader= new Loader();
   loader.load(new URLRequest("donde.swf"));
   //Y lo añadimos
   addChild(loader).name = "loader_name"; //<--te he cambiado el nombre
}

Ya que hemos declarado la variable fuera, aunque le podemos dar valro a su "propiedad" name, podemos usar la variable "loader". Vamos, en cualquier lugar de nuestra película podríamos escribir

Código ActionScript :

var ld:Loader=getChildByName("loader_name") as Loader
ld.x=100
//que
loader.x=100

NOTA3:Es sobre el argumento de nuestra función "botonPulsado": ese "e:MouseEvent". Lo podemos usar para aplicar la misma función a varios botones. Lo pongo con un ejemplo simple de dos botones cuyo nombre de instancia sean "boton1" y "boton2"

Código ActionScript :

boton1.name="boton1_name"
boton2.name="boton2_name"
boton1.addEventListener(MouseEvent.CLICK,botonPulsado)
boton2.addEventListener(MouseEvent.CLICK,botonPulsado)
private function botonPulsado(e:MouseEvent){
    switch (e.target.name){
              case "boton1_name":
                     trace("boton1")
              break
              case "boton2_name":
                     trace("boton2")
              break
     }
}

NOTA4:(la última, lo juro) Cuando vamos a cargar varias películas, lo "suyo" es cargarlas en EL MISMO loader. Así que podemos tener un único "Loader"

Código ActionScript :

boton1.name="boton1_name"
boton2.name="boton2_name"
boton1.addEventListener(MouseEvent.CLICK,botonPulsado)
boton2.addEventListener(MouseEvent.CLICK,botonPulsado)
//creo un loader y lo añado
var loader:Loader =new Loader()
addChild(loader)
private function botonPulsado(e:MouseEvent){
    string pelicula="";
    switch (e.target.name){
              case "boton1_name":
                     pelicula="pelicula1.swf";
              break
              case "boton2_name":
                     pelicula="pelicula2.swf";
              break
     }
    loader.load(new URLRequest(pelicula));
}

NOTA5:Si has conseguido llegar hasta aquí, ¡¡enhorabuena!! :)

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Abr 2010 09:42 pm
muchismas gracias por toda esta info, vendo de cenar y es un pelin tarde, mañana lo probare y te comento.

Saludos y un millon de gracias.

Por selito

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Abr 2010 12:46 pm
Buenas, bueno he llegado asta abajo de todo lo que me has comentado, lo he entendido bastante bien pero tengo un par de dudas, una que me vas a llamar tonton es que no se donde poner el codigo, porque si lo pongo en cualquier frame de la escena me da error y en los botones no me deja poner codigo :S

Y luego tb he estado probandolo y me da error esta linea:

private function botonPulsado(e:MouseEvent){

Que ahora mismo ando un poco perdido, te comento yo lo que quiero es, creas un boton y que cuando le des click se abra un swf externo dentro de un mc vacio.

Si seguro que no voi mal encaminado pero me cuesta bastante.

Saludos.

Por selito

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Abr 2010 11:31 pm
Por partes. en principio en AS.3 se escribe el código SIEMPRE en un frame. Vale, se tiene la tendencia a escribir el código el un .as que es la "clase de documento" (En propiedades, cuando seleccionas la película, tienes la clase de documento) pero en el código que puse es directamente en el frame.

Por otra parte, cuando tenemos en un frame un MovieClip -o un botón- con un "nombre de instancia·. Flash lo traduce como si tuvieras una "variable que hace referencia al Movieclip (o al botón). Por eso, si escribimos en un frame

Código ActionScript :

boton1.addEventListener(MouseEvents.MOUSE_CLICK,unafuncion)

es porque tenemos que tener en el frame donde escribimos el código un MC (o Botón) cuyo NOMBRE DE INSTANCIA es "boton1" (sin las comillas). Si no lo tenemos, dará error porque Flash no sabe "a quién" añadirle el listener (Vale, técnicamente, no tiene ningún valor la variable "boton1")

Respecto a lo de la función botonPulsado supongo que el error es que "he relajado" un poco la notación. Debería ser

Código ActionScript :

private function  botonPulsado(e:MouseEvent):void{ 
    .....
}

Le he añadido "void" porque la función no devuelve ningún valor

€En cualquier modo fijaté si tienes que añadir algún "import"

Código ActionScript :

import flash.event.MouseEvent

Por Eliseo2

710 de clabLevel



 

msie8
Citar            
MensajeEscrito el 12 Abr 2010 01:46 am
muy buena explicación Eliseo! como siempre un maestro!
y bueno yo aporto mi granito de arena, como me encanta hacer todo con la menor cantidad de recursos se me ocurre ponerle de name a los botones el nombre de la peli a cargar con eso me ahorro el switch...

Código ActionScript :

boton1.name="pelicula1.swf" 
boton2.name="pelicula2.swf" 
boton1.addEventListener(MouseEvent.CLICK,botonPulsado) 
boton2.addEventListener(MouseEvent.CLICK,botonPulsado) 
//creo un loader y lo añado 
var loader:Loader =new Loader() 
addChild(loader) 
private function botonPulsado(e:MouseEvent){    
    loader.load(new URLRequest(e.target.name)); 
} 


como lo ves???
Un Saludo!
Pablo.

Por Pablokorku

60 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Abr 2010 08:00 am
Efectivamente, Pablo, tienes razón. Lo del "switch" era un modo de explicarlo. Si sólo necesitamos una "variable" (en este caso sólo necesitamos la película) está bien usar la "propiedad" name. sí es cierto que a veces se prefiere usar la propiedad "name" para dar un nombre con un sufijo y realizar la acción según ese sufijo. Sí es menos "eficiente" (en el sentido de que debemos usar un getstr) pero ayuda a leer el código en el sentido de que parece que "name" es para nombres.

Código ActionScript :

boton1.name="boton1"  
boton2.name="boton2"  
boton1.addEventListener(MouseEvent.CLICK,botonPulsado)  
boton2.addEventListener(MouseEvent.CLICK,botonPulsado)  

private function botonPulsado(e:MouseEvent){     
    loader.load(new URLRequest("pelicula"+e.target.name.substr(5)+".swf"));  
} 

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Abr 2010 02:14 am
Buenísimo!
para este caso sencillito me parece muy útil escribirlo así!

Saludos!

Por Pablokorku

60 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Abr 2010 11:26 am
Bueno al final con tanta explicacion me habeis vuelto loco, jejejejejje.

el caso es que me hariais un favor si pudierais ponerme el codigo completo porque ya no se cual probar, solo quiero poder cliquear un boton y que abra un swf en un MC VACIO con nombre de instancia contenedorindex.

Muchas gracias de antemano, pero es que soi un pelin negado para estas cosas, un saludo.

Por selito

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Abr 2010 11:51 am
Vale, un "corta y pega" (pero echalé cuando tengas tiempo un nuevo vistazo al post, anda) puesto que no te hace falta ningún MC vacío.

Si el nombre de instancia de tu MC vacío es "contenedorIndex", el nombre de instancia de tu botón es "boton1" y queremos cargar "pelicula.swf", escribe el siguiente código en un frame donde tengas tu botón y tu MC vacío.

Código ActionScript :

//creo un loader y lo añado  a "contenedorIndex"
var loader:Loader =new Loader()  
contenedorIndex.addChild(loader)  //<--con addChild añado el loader
                      //como lo quiero añadir a "contenedorIndex" pongo contenedorIndex.addChild(loader)
                      //Si lo quisiera añadir a la película principal pondría addChild(loader)

//Añadimos el listener
boton1.addEventListener(MouseEvent.CLICK,botonPulsado)  

private function botonPulsado(e:MouseEvent):void{     
    loader.load(new URLRequest("pelicula.swf"));
} 

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Abr 2010 05:19 pm
Okis, mas o menos lo entiendo lo que hago es lo siguiente, en la capa donde tengo el boton1, añado el mc vacio llamado contenedorindex, en el 1º frame de esta capa pongo el codigo y me da el siguiente error:

Escena 1, Capa " boton donde ", fotograma 1, linea 10 1013: El atributo private sólo se puede utilizar en definiciones de propiedad de clase.

Por selito

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Abr 2010 06:31 am
Estoy aprendiendo a programar Flash CS3 con AS3, todavia soy nuevo, y encontré este articulo casi justo lo que necesitaba, pero necesitaba en otra forma similar (mostrar un swf externo con un enlace no con boton) a lo que muestra este articulo:

Necesito que me cargue un swf externo através de un enlace asi de la siguiente forma:

linkText.htmlText = 'Link: <a href="Event:cargaArchivo,micarpeta/mipelicula.swf">Click</a>;

en un movieClip vacio en la pelicula principal, y lo otro, también seria bueno de como hacer una funcion que llame a un archivo plano en txt y que muestre el txt en la pelicula principal, y ahi en la pelicula principal va a contener una lista de varios enlaces cargado previamente con el archivo plano txt, que va a cargar un swf externo a medida que haya dando click a uno de los enlaces.

Como hago para hacer esto ?

Muchas Gracias ...

Por famq23

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Abr 2010 06:39 am
Selito, quitalé el "private"
Famq23, tienes que usar el evento "LINK" de un TextField (en el enlace, busca el evento LINK y verás un ejemplo)

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Abr 2010 10:42 am
eliseo no hay manera, quito lo de private lo pongo e el 1º frame de la capa del boton y el mc y no va no hace nada, lo cambio de frame, lo pongo en el ultimo frame de la capa del bton y el mc y tampoco funciona, ya no se si es por culpà del codigo o algo que hago mal.

Por selito

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Abr 2010 02:26 pm
Bueno, resuelto, al final no funcionaba por otra cosa, entonces pense voi a empezar de 0 con lo que tenia hecho no sea que hubiera alguna cosa mal, y ahora va todo perfecto, muchas gracias por la paciencia. ;)

Por selito

5 de clabLevel



 

firefox

 

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