Comunidad de diseño web y desarrollo en internet online

Carga aleatoria SWF externos con AS3

Citar            
MensajeEscrito el 01 Ago 2011 03:51 pm
Hola, espero me puedan ayudar, hace un tiempo vi el código de Freddie hacerca de este tema con AS2 pero ahora necesito la misma función pero con AS3 y no encuentro algo que me pueda ayudar tengo este código pero sólo carga un swf no hace el random por favor y gracias. ^^

Código ActionScript :

var myPaths:Array = new Array("slides/slide000.swf","slides/slide001.swf");
var index = Math.floor(Math.random() * myPaths.length);
var loadRequest:URLRequest = new URLRequest(myPaths[index]);

var swfLoader:Loader = new Loader();
swfLoader.load(loadRequest);
contenedor.addChild(swfLoader);
contenedor.x = 0
contenedor.y = 92.1

Por khonsu100

3 de clabLevel



Genero:Femenino  

Diseñadora Gráfica

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:15 pm
Esto tiene que estar dentro de una función, y lo tienes que llamar varias veces, así como está se ejecuta una sola vez

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:24 pm
ok gracias por la respuesta, pero es que no entiendo bien el "nuevo" código y no como hacerlo, por favor si me puedes ilustrar. :lol:

Por khonsu100

3 de clabLevel



Genero:Femenino  

Diseñadora Gráfica

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:25 pm
viendo tu code no le vi ningun problema, pero quise saber "porque no hacia el random" y probe tu codigo

Código ActionScript :

import flash.display.Loader;
import flash.net.URLRequest;

var myPaths:Array = new Array("slides/slide000.swf","slides/slide001.swf"); 
var index:uint = Math.floor(Math.random() * myPaths.length); 
var loadRequest:URLRequest = new URLRequest(myPaths[index]); 
 
 trace(index); // da 0 o 1 ya que solo hay 2 objetos en el array
 
var swfLoader:Loader = new Loader(); 
swfLoader.load(loadRequest); 
contenedor.addChild(swfLoader); 
contenedor.x = 0 
contenedor.y = 92.1


simule tu codigo en mi cs5 y claro que funciona, si hace el random, con el trace lo puedes probar ya que arroja diferentes valores... ahora si quieres que lo haga varias veces tendiras que manejar una funcion y hacer loops o usar listeners... ya que asi como tienes tu codigo, flash solo lo lee 1 vez y muestra el SWF que cargo con random esa unica vez....

Por ilvxor

11 de clabLevel



 

c++ as3

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:28 pm
Declaras lo que reusas fuera y en la función haces la carga:

Código ActionScript :

var myPaths:Array = new Array("slides/slide000.swf","slides/slide001.swf"); 
var swfLoader:Loader = new Loader(); 
contenedor.addChild(swfLoader); 
contenedor.x = 0 
contenedor.y = 92.1

function carga(){
  var index = Math.floor(Math.random() * myPaths.length); 
   var loadRequest:URLRequest = new URLRequest(myPaths[index]);  
   swfLoader.load(loadRequest);   
}


Cada vez que llames a la función cargará uno al azar

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:40 pm
Pues si lo que quiero es que se vea como un loop con swf aleatorios, probé con el código de Jorge pero ahora no me carga ningún swf. Que pena la molestia. :oops:

Por khonsu100

3 de clabLevel



Genero:Femenino  

Diseñadora Gráfica

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:46 pm
¿Lo copypasteaste? ¿Notaste que no estoy llamando la función? ¿Que pasa si ahora le agregas?

carga();

Evidentemente se ejecuta una sola vez, porque lo llamas una vez ... deberías usar un Timer para llamarlo cada N segundos

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:50 pm

khonsu100 escribió:

Pues si lo que quiero es que se vea como un loop con swf aleatorios, probé con el código de Jorge pero ahora no me carga ningún swf. Que pena la molestia. :oops:


jorge solo creo una funcion, si quieres que cargue tendrias que mandar a llamar a la funcion "carga();"

Código ActionScript :

var myPaths:Array = new Array("slides/slide000.swf","slides/slide001.swf"); 

var swfLoader:Loader = new Loader(); 

contenedor.addChild(swfLoader); 

contenedor.x = 0 

contenedor.y = 92.1

carga(); //AQUI flash lee que estas mandando a llamar a esta funcion y va a hacer todo lo que este dentro de "carga"

function carga(){

  var index = Math.floor(Math.random() * myPaths.length); 

   var loadRequest:URLRequest = new URLRequest(myPaths[index]);  

   swfLoader.load(loadRequest);   

}


si quieres un loop, tienes que mandar a llamar a la funcion carga varias veces, un ejemplo sencillo seria

Código ActionScript :

var myPaths:Array = new Array("slides/slide000.swf","slides/slide001.swf"); 

var swfLoader:Loader = new Loader(); 

contenedor.addChild(swfLoader); 

contenedor.x = 0 

contenedor.y = 92.1

var numVeces = 10;

function repetir(){
  for(var i:int = 0; i < numVeces; i++){
      carga();  //mientras 'i' sea menor que numVeces, este mandara a llamar a 'carga'
 }
}

function carga(){

  var index = Math.floor(Math.random() * myPaths.length); 

   var loadRequest:URLRequest = new URLRequest(myPaths[index]);  

   swfLoader.load(loadRequest);   

}

Por ilvxor

11 de clabLevel



 

c++ as3

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:55 pm
en el codigo de arriba me falto manda a llamar a "repetir()"... asi como te paso con el codigo de jorge, que tenias que mandar a llamar a "carga()" para que este se ejecute.. porcierto, ese codigo no lo recomiendo porque este codigo no espera a que la carga este al 100%, y cambiara las 10 veces mui rapido que talves notes el cambio solo 2 veces, o igual y no te corre bien el programa.. lo puse como un ejemplo ya que veo no tienes mucha idea en lo que a programar se refiere

Por ilvxor

11 de clabLevel



 

c++ as3

firefox
Citar            
MensajeEscrito el 01 Ago 2011 05:58 pm
ilvxor: si haces un loop para muchas cargas, se pisarán mutuamente y verás solo la última. Intenta hacer lo mismo, pero con un Timer que llame a carga() cada por ejemplo, 10 segundos. Ojo, ahora carga recibirá como argumento un TimerEvent

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 01 Ago 2011 06:29 pm
asi es Jorge.. ya lo tenia visto pero solo fue para ejemplo..aunque como dije, no se recomienda en lo absoluto...

porcierto, khonsu100 la manera de aprender bien es dandole duro, asiq siempre trata de salir de tus dudas por tu cuenta... ok para finalizar este tema.. te dejo un codigo que hice sobre tu problema, es tal y como Jorge dijo, un timer indicara cada cuando debera hacer la nueva carga.

Código ActionScript :

import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;

var myPaths:Array = new Array("slides/slide000.swf","slides/slide001.swf"); 
var index:uint;
var loadRequest:URLRequest = new URLRequest(); 
var swfLoader:Loader = new Loader(); 

contenedor.addChild(swfLoader); 
contenedor.x = 0 
contenedor.y = 92.1

/*codigo extra*/
var milisegundos:int = 1000; // 1 segundo
var cuantosSegundos:int = 3; // cuantas veces se repitira el timer
var tiempo:Timer; //creo la variable timer

cargar(); //mando a llamar a cargar por 1ra vez

//listener que indica cuando la carga esta completa
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, cargaCompleta); 

function cargar():void{
   
   tiempo =  new Timer(milisegundos, cuantosSegundos); // creo el timer
   tiempo.stop(); //detengo al timer
   
   //agrego listener que indica cuando el timer a finalizado de repetirse
   tiempo.addEventListener(TimerEvent.TIMER_COMPLETE, nuevaCarga);
   
   trace("cargando..");
   index = Math.floor(Math.random() * myPaths.length); 
   loadRequest.url = myPaths[index];
   swfLoader.load(loadRequest); 
}

function cargaCompleta(evento:Event):void{
   trace("carga al 100%");
   tiempo.start(); //empieza el tiempo, inicia el timer
}

function nuevaCarga(evento:TimerEvent):void{
   trace("han pasado: "+ cuantosSegundos+"segundos");
   //quito el listener que le agregue al timer
   tiempo.removeEventListener(TimerEvent.TIMER_COMPLETE, nuevaCarga);
   
   cargar();
}


este codigo, carga un archivo externo cada 3 segundos... probado y funciona (Y)

Por ilvxor

11 de clabLevel



 

c++ as3

firefox
Citar            
MensajeEscrito el 01 Ago 2011 07:25 pm
ilvxor: está bien el ejemplo, va bien encaminado, pero hay errores de concepto y una estructura un poco rebuscada

- El segundo argumento del constructor del timer es la cantidad de repeticiones, el tiempo es el primer argumento.
- No hace falta crear un timer dentro de la funcion cargar, lo arrancas fuera, lo apuntas a cargar, y no le pones la cantidad de repeticiones, será un loop forever

Si no queda claro agrego code, pero creo que con estas pistas puedes mejorarlo

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 02 Ago 2011 04:45 am

solisarg escribió:

ilvxor: está bien el ejemplo, va bien encaminado, pero hay errores de concepto y una estructura un poco rebuscada

- El segundo argumento del constructor del timer es la cantidad de repeticiones, el tiempo es el primer argumento.
- No hace falta crear un timer dentro de la funcion cargar, lo arrancas fuera, lo apuntas a cargar, y no le pones la cantidad de repeticiones, será un loop forever

Si no queda claro agrego code, pero creo que con estas pistas puedes mejorarlo

Jorge


gracias por el comentario... lo del timer, ya me se que el 1ro es el tiempo y el 2do argumento es el loop...

lo de cargar el timer desde afuera de la funcion se me ocurrio pero al hacerlo a la prisa no quise pensarle como puesto no me gusta ocupar memoria cada vez que mando a llamar "cargar()"..
imagino q la declaracion a fuera seria normal

var tiempo:Timer = new Timer(milisegundos, cuantosSegundos);
tiempo.stop();

y en la funcion "nuevaCarga()" agregaria

tiempo.reset();
tiempo.stop();

bueno esto supongo al ver las ideas que mencionas, y lo de que es un loop infinito, hehe muy cierto, eso si se me paso por completo, ya tendria que pensarle en talvez agregar una funcion que al detectar el numeroVeces que el usuario quiera el ciclo para finalizarlo... saludos

Por ilvxor

11 de clabLevel



 

c++ as3

firefox
Citar            
MensajeEscrito el 03 Ago 2011 03:13 pm
La verdad muchísimas gracias, no había tenido tiempo de retomar el foro, pero muchas gracias, y si tienen razón me voy a dar a la tarea de aprender y "entender" bien como funciona el lenguaje, por ahora un chocolate virtual para cada uno de agradecimiento. :lol: :wink:

Por khonsu100

3 de clabLevel



Genero:Femenino  

Diseñadora Gráfica

firefox

 

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