Foros del Web » Creando para Internet » Flash y Actionscript »

problemas con setTimeout

Estas en el tema de problemas con setTimeout en el foro de Flash y Actionscript en Foros del Web. Saludos. Tengo un arreglo de números comprendidos entre 1 y 4. Y tengo en la escena 4 mc que simulan bombillos de navidad, cada bombillo ...
  #1 (permalink)  
Antiguo 05/11/2007, 15:00
Avatar de oswaldog  
Fecha de Ingreso: diciembre-2003
Ubicación: Lara
Mensajes: 90
Antigüedad: 20 años, 10 meses
Puntos: 0
problemas con setTimeout

Saludos. Tengo un arreglo de números comprendidos entre 1 y 4. Y tengo en la escena 4 mc que simulan bombillos de navidad, cada bombillo es un color diferente (azul, verde, amarillo y rojo). Lo que deseo es que se recorra el arreglo y según el número que indique el arreglo se encienda un bombillo, estoy usando la función setTimeout para que de tiempo de visualizarlos, sin embargo recorre el arreglo y solo funciona con el ultimo elemento. Les dejo el código a ver si alguien encuentra lo que está mal y me ayuda a resolver el problema.

Gracias...




Código:
var num:Number;
var j:Number;
var secuencia:Array = new Array(2,3,4,1,3);
var level:Number;


function delay() {
	_global.mc.play();
}

level = secuencia.length;

for (var i:Number = 0; i<=level; i++) {
	j = secuencia[i];
	switch (j) {
	case 1 :
		_global.mc = mcazul;
		setTimeout(delay,1000);
		break;
	case 2 :
		_global.mc = mcverde;
		setTimeout(delay,1000);
		break;
	case 3 :
		_global.mc = mcrojo;
		setTimeout(delay,1000);
		break;
	case 4 :
		_global.mc = mcamarillo;
		setTimeout(delay,1000);
		break;
	}
}
__________________
Gracias, Oswaldo

"Compartir tus conocimientos. Es una buena manera de ganarse la inmortalidad"
  #2 (permalink)  
Antiguo 05/11/2007, 18:35
Avatar de Turdo  
Fecha de Ingreso: julio-2005
Ubicación: .:Guadalajara:.
Mensajes: 398
Antigüedad: 19 años, 3 meses
Puntos: 23
De acuerdo Re: problemas con setTimeout

Que tal Oswald!!

Te dejo tu codigo con una modificacion para que tengas el loop que imagino quieres hacer y me dices si te funciono:


Código:
var j:Number = 0;
var secuencia:Array = new Array(2, 3, 4, 1, 3);

function delay() {
	_global.mc.play();
}

onEnterFrame = function () {
	trace(_root.j);
	_root.j++;
	switch (_root.j) {
	case 1 :
		_global.mc = mcazul;
		setTimeout(delay, 1000);
		break;
	case 2 :
		_global.mc = mcverde;
		setTimeout(delay, 1000);
		break;
	case 3 :
		_global.mc = mcrojo;
		setTimeout(delay, 1000);
		break;
	case 4 :
		_global.mc = mcamarillo;
		setTimeout(delay, 1000);
		break;
	}

	if (_root.j>=6) {
		_root.j = 0;
	}
};


El onEnterFrame = function(), hace el loop o bucle para que se repitiendo el switch e incrementando la variable j, con el if al final del loop comparo que j es mayor que 6 la igualemos a cero y siga el bucle sin fin.

A hora por que comparamos la j con 6 y no con 4, que es el numero de colores que tienes?

Por la razon que el swf corre a 12 frames por segundo y 6 es la mitad entonces cada medio segundo, cada mc hace play, si quieres que dure un segundo solo pon 12 en el if

El trace lo puse para que vieras lo que pasa con j

Última edición por Turdo; 05/11/2007 a las 18:47 Razón: Dar formato al texto
  #3 (permalink)  
Antiguo 05/11/2007, 20:33
Avatar de oswaldog  
Fecha de Ingreso: diciembre-2003
Ubicación: Lara
Mensajes: 90
Antigüedad: 20 años, 10 meses
Puntos: 0
Re: problemas con setTimeout

Gracias Turdo. No conocía esa función, y aunque los mc de los bombillos con ayuda de tu modificación del código se visualizan, me parece que controlarlos por medio de esa función es más difícil. Primero, porque en realidad no necesito el bucle. Solo necesito que los bombillos enciendan y apaguen 1 a la vez según el arreglo lo indique; y segundo, porque es preciso que el lapso sea igual entre un bombillo y otro.

Sabes por que no funciona setTimeout? Coloqué unos trace en cada Case después de donde llamo a la función setTimeout, y uno dentro de la función delay después de _global.mc.play(). Cuando ejecuto, en la ventana de salida muestra primero todos los trace de los case, uno detrás de otro según número de ítem tenga el arreglo, y después los del delay, repitiendo el último llamado de esa función todas las veces; y no los realiza alternos como la lógica sugiere.

Agradezco mucho tu ayuda
__________________
Gracias, Oswaldo

"Compartir tus conocimientos. Es una buena manera de ganarse la inmortalidad"
  #4 (permalink)  
Antiguo 05/11/2007, 23:50
Avatar de Turdo  
Fecha de Ingreso: julio-2005
Ubicación: .:Guadalajara:.
Mensajes: 398
Antigüedad: 19 años, 3 meses
Puntos: 23
Re: problemas con setTimeout

Hola de nuevo!!

El motivo por el cual no funciona el setTimeout del modo que tu lo planteas, es por que es necesario tener una accion o evento para activarlo.

En tu planteamiento utilizas un switch el cual utiliza un evento, ya sea del usuario o de la programacion que tu le incertas, tambien utilizas un for este for es el disparador del evento que activa el setTimeout por medio del switch. El for por si solo no es un evento, es un siclo finito, pero su resultado final si. Y es por eso que solo prende la ultima luz. por que tu arreglo dice que el ultimo sea el 3 que es la posicion 5 que es el resultado de la del for: i<=level level tiene la longitud del array osea 5.

Lo que no entiendo, es para que quieres que enciendan las bombillas segun el arreglo, una especie de semaforo o contador, o talvez un indicador de coneccion o indicar donde se esta como una seccion? tal vez si lo mencionaras seria mas facil resolber tu problema.
  #5 (permalink)  
Antiguo 06/11/2007, 00:29
Avatar de Offrenbaruna  
Fecha de Ingreso: octubre-2004
Mensajes: 537
Antigüedad: 20 años, 1 mes
Puntos: 1
Re: problemas con setTimeout

yo doy mi opinion y a ver si ayuda, setTimeout solo funciona con AS3, si es que no me equivoco.

Saludos
__________________

  #6 (permalink)  
Antiguo 06/11/2007, 05:11
Avatar de oswaldog  
Fecha de Ingreso: diciembre-2003
Ubicación: Lara
Mensajes: 90
Antigüedad: 20 años, 10 meses
Puntos: 0
Re: problemas con setTimeout

Cita:
Iniciado por Turdo Ver Mensaje
Hola de nuevo!!
Lo que no entiendo, es para que quieres que enciendan las bombillas segun el arreglo, una especie de semaforo o contador, o talvez un indicador de coneccion o indicar donde se esta como una seccion? tal vez si lo mencionaras seria mas facil resolber tu problema.
Estoy tratando de hacer el clasico juego de memoria "simon". Lo de la secuencia me la da el arreglo que lo voy llenado aleatoriamente con la funcion random() y cada vez que se incluye un valor ejecuto el mc que corresponda y luego lo comparo, posición por posición con otro arreglo que va llenando el usuario a medida que intenta seguir la misma secuencia. Espero que esto ayude, gracias...
__________________
Gracias, Oswaldo

"Compartir tus conocimientos. Es una buena manera de ganarse la inmortalidad"
  #7 (permalink)  
Antiguo 07/11/2007, 05:32
Avatar de oswaldog  
Fecha de Ingreso: diciembre-2003
Ubicación: Lara
Mensajes: 90
Antigüedad: 20 años, 10 meses
Puntos: 0
Re: problemas con setTimeout

nadie que me pueda dar una mano con esto? sino es el setTimeout ni el setInterval, ni el onEntreFrame. con cual?
__________________
Gracias, Oswaldo

"Compartir tus conocimientos. Es una buena manera de ganarse la inmortalidad"
  #8 (permalink)  
Antiguo 07/11/2007, 11:06
Avatar de Offrenbaruna  
Fecha de Ingreso: octubre-2004
Mensajes: 537
Antigüedad: 20 años, 1 mes
Puntos: 1
Re: problemas con setTimeout

que te parece poniendo e setTimeout asi:
Código PHP:
case :
_global.mc mcazul;
setTimeout(delay,1000);
function 
delay() {
    
_global.mc.play();
}
break; 
En el peor de los casos prueva poniendo la function de delay al final de los case
__________________

  #9 (permalink)  
Antiguo 07/11/2007, 17:12
Avatar de oswaldog  
Fecha de Ingreso: diciembre-2003
Ubicación: Lara
Mensajes: 90
Antigüedad: 20 años, 10 meses
Puntos: 0
Re: problemas con setTimeout

Igual Offrenbaruna. no consigo que funcione, este es el código que parece estar más cerca de lo que debería hacer :

Código:
var num:Number;
var j:Number;
var secuencia:Array = new Array(2,1,3,4,1,3,1,2);
var level:Number;
var mc:MovieClip;
//num = random(4);
//num++;
level = secuencia.length;

	function delay(peli:MovieClip) {
	peli.play();
	trace(this.mc);
	}

for (var i:Number = 0; i<=level; i++) {
	j = secuencia[i];

	switch (j) {
	case 1 :
		this.mc = mcazul;
		setTimeout(delay(this.mc),500);
		//setInterval(delay(),2000);
		trace("azul");
		break;
	case 2 :
		this.mc = mcverde;
		setTimeout(delay(this.mc),500);
		//setInterval(delay(),400);
		trace("verde");
		break;
	case 3 :
		this.mc = mcrojo;
		setTimeout(delay(this.mc),500);
		//setInterval(delay(),400);
		trace("rojo");
		break;
	case 4 :
		this.mc = mcamarillo;
		setTimeout(delay(this.mc),500);
		//setInterval(delay(),400);
		trace("amarillo");
		break;
	
	}
}

trace("LISTO!");
gotoAndStop(1);
Con ese, los trace en la ventana de salida, se ven así:

Cita:
_level0.mcverde
verde
_level0.mcazul
azul
_level0.mcrojo
rojo
_level0.mcamarillo
amarillo
_level0.mcazul
azul
_level0.mcrojo
rojo
_level0.mcazul
azul
_level0.mcverde
verde
LISTO!
Cosa que no sucede cuando incluyo los mc dentro de los case, ni dentro del swicth, ni tampoco dentro del for. Así se ve (por los trace) que la variable del mc pasa bien a la funcion delay, pero no se porque no se ejecuta el mc.play() y la función setTimeout tampoco hace el retardo. Sabes de otra función u otra forma, llevo días dandole y no logro pasar de allí.
__________________
Gracias, Oswaldo

"Compartir tus conocimientos. Es una buena manera de ganarse la inmortalidad"
  #10 (permalink)  
Antiguo 07/11/2007, 22:18
Avatar de Offrenbaruna  
Fecha de Ingreso: octubre-2004
Mensajes: 537
Antigüedad: 20 años, 1 mes
Puntos: 1
Re: problemas con setTimeout

lo que se me ocurre para poder arreglar tu problema es que pongas con random tu arreglo y que ese random ejecute la funcion que oviamente pueda ejecutar el bombillo con un a variable, si es que entiendo lo que quieres lograr.

Un saludo y dime si te entendi y pues voy a seguir pensando en como poder resolberlo
__________________

  #11 (permalink)  
Antiguo 08/11/2007, 05:55
Avatar de oswaldog  
Fecha de Ingreso: diciembre-2003
Ubicación: Lara
Mensajes: 90
Antigüedad: 20 años, 10 meses
Puntos: 0
Re: problemas con setTimeout

Cita:
Iniciado por Offrenbaruna Ver Mensaje
lo que se me ocurre para poder arreglar tu problema es que pongas con random tu arreglo y que ese random ejecute la funcion que oviamente pueda ejecutar el bombillo con un a variable, si es que entiendo lo que quieres lograr.

Un saludo y dime si te entendi y pues voy a seguir pensando en como poder resolberlo

Exacto, con la misma lógica lo pensé yo y de hecho lo hace, pero todo el problema se encuentra para reproducir los mc. Me pueden mostrar como en un mismo frame ejecuto 2 mc, uno primero y otro después, solo con as.
__________________
Gracias, Oswaldo

"Compartir tus conocimientos. Es una buena manera de ganarse la inmortalidad"
  #12 (permalink)  
Antiguo 08/11/2007, 06:37
Avatar de oswaldog  
Fecha de Ingreso: diciembre-2003
Ubicación: Lara
Mensajes: 90
Antigüedad: 20 años, 10 meses
Puntos: 0
Re: problemas con setTimeout

Lo que veo es que la ejecución del código no respeta lo que dura el mc, cuando lo llamo desde el fotograma para que se ejecute sigue recooriendo el código y no hace una pausa cuando el control lo debería tener el mc.
__________________
Gracias, Oswaldo

"Compartir tus conocimientos. Es una buena manera de ganarse la inmortalidad"
  #13 (permalink)  
Antiguo 10/11/2007, 21:20
Avatar de Turdo  
Fecha de Ingreso: julio-2005
Ubicación: .:Guadalajara:.
Mensajes: 398
Antigüedad: 19 años, 3 meses
Puntos: 23
Re: problemas con setTimeout

Hola de nuevo!!! perdona el abandono jeje

Creo que ia entendi el problema y lo he resuelto!!

Me corrijes si me equiboco. El usuario maraca sus respuestas, despues la comparas con el arreglo, pero lo ke kieres es mostrar el arreglo que generaste aleatoriamente de manera grafica para que despues el partisipante lo vea y lo iguale con su memoria.

Aki te dejo el codigo que hice:

Código:
stop();
setInterval(_root.delay, 2000);
var j:Number = 0;
var posicion:Number = -1;
var secuencia:Array = new Array(2,1,3,4,1,3,1,2);
var quien:MovieClip;
function delay() {
	switch(secuencia[posicion++]){
		case 1:
		quien = _root.mcazul;
		quien.play();
		break;
		case 2:
		quien = _root.mcverde;
		quien.play();
		break;
		case 3:
		quien = _root.mcrojo;
		quien.play();
		break;
		case 4:
		quien = _root.mcamarillo;
		quien.play();
		break;
	}
	if(posicion >= secuencia.length){
		return;
	}
	trace(secuencia[posicion]+",*"+posicion);
}
Me cuentas si te resulto!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:05.