Comunidad de diseño web y desarrollo en internet online

Restablecer todos los MovieClips + Carga aleatoria "intelige

Citar            
MensajeEscrito el 27 Oct 2008 10:15 am
Buenas! les cuento que hace tiempo me "nutro" del foro, pero recién ahora estoy con mi primer posteo... Estoy muy atrasado con una entrega que no puedo solucionar, a ver si alguien tiene un tiempo para ayudarme:

Hice un juego de trivia, como cada pregunta tiene animaciones particulares, separé cada pregunta en swf independientes.
En el swf principal, hice un MC contenedor para cargar aleatoriamente estas películas.

Tengo 2 problemas sin resolver:


· NUMERO 1
En primer lugar, no puedo hacer que la carga aleatoria no repita lo que ya ha cargado. Busqué eternamente y lo que más se acerca es un post para carga aleatoria sin repetición de mp3. Intenté modificarlo, pero no me funciona.
Estoy cargando los swf con el siguiente código:


Código :

preguntacontenedor.loadMovie("q" + (1+random(32)) + ".swf");  




PROBLEMA NUMERO 1:
Necesito que las preguntas no se repitan, es decir, cargar aleatoriamente los swf de las películas (q1.swf, q2.swf.... q32.swf) de alguna manera que quede registrado lo que se cargó y no se repita.



· NÚMERO 2
Al final del juego, está la opción de volver a jugar, hayas perdido o hayas ganado.



PROBLEMA NUMERO 2:
Al responder las 5 preguntas (es decir, al completar el juego, para lo cual se cargaron aleatoriamente 5 swf externos), y tocar en el botón "volver a jugar", la nueva partida tiene problemas: principalmente, el counter se vuelve loco: se acelera, no respeta los segundos... incluso tira valores negativos.
Calculo que será que hay que resetear los movie clips, pero no se cómo hacerlo.
El botón "volver a jugar" tiene el siguiente código:




Código :

on (release) { 
    gotoAndPlay("Scene 1", 1); 
}  




Eso es todo, espero que alguien pueda darme una mano con esto que tengo que entregar esta tarde!!!

Saludos y muchísimas gracias!!!
Ricardo.

Por jricardoar

10 de clabLevel



 

safari
Citar            
MensajeEscrito el 27 Oct 2008 01:06 pm
Está posteada la función para los random que no se repitan por acá, pero acá va otra (se basa en mezclar una serie de 1 a la cantidad que le pases como argumento)

Código ActionScript :

function randomSerie(howMany){
   var a:Array = new Array()
   var b:Array = new Array()
   for(var i=1; i<=howMany; i++) a.push(i)
   var total:Number = a.length
   for(var i=0; i<total; i++) b.push(a.splice(int(Math.random()*a.length), 1))
   return b
}
//Ejemplo donde el botón newnumber llama a una serie de 12
newnumber.onPress = function(){
   var serie = randomSerie(12)
   trace(serie)
}


Acá la discusión completa del caso: http://www.flash-db.com/Board/index.php?topic=18822.0

En cuanto al counter suena como si estuviera ligado a un setInterval que no borras, pero en cualquier caso tienes que explicar como estás seteando su valororge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 27 Oct 2008 01:27 pm
Gracias por la respuesta!!!
Voy a mirar lo que me comentás a ver si lo puedo aplicar.

En cuanto al countdown, te cuento que están en cada "sub-swf" por separado, es decir, que son de cada pregunta en particular.

está en un mc con nombre de instancia "tenSeconds".
Dentro de él, hay dos layers, uno con un texto dinámico con nombre de instancia "secText" y var "sSeconds".
En el otro layer hay sólo código:

frame 1:

Código :

stop();
sec = 45;
secText.text = sec;
timer = setInterval(countDown, 1000);
function countDown() {
 sec--;
 if (sec <= 0) {
   timer = clearInterval(timer);
   secText.text = "0";
   _parent.gotoAndPlay("tiempofuera");
 }
 secText.text = sec;
}



frame 5

Código :

stop();



y eso es todo... se supone que debe hacer una cuenta regresiva de 45 a 0, en segundos, y que cuando llegue a 0 te envíe al frame etiquetado como "tiempofuera"...
En realidad, lo hace todo bien, sólo que cuando termina el juego y cilqueás en "volver a jugar":

Código :

on (release) {
   gotoAndPlay("Scene 1", 1);
}


El contador se acelera y hace cosas raras, como pasar de a dos segundos...

¿tenés idea por qué podrá ser?

Ricardo

Por jricardoar

10 de clabLevel



 

safari
Citar            
MensajeEscrito el 27 Oct 2008 01:42 pm
Sip, los setinterval no se borran y se acumulan, esto por ejemplo:

timer = clearInterval(timer);

debería ser

clearInterval(timer);

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 27 Oct 2008 05:10 pm
Lo probé y no cambió, sigue pasando lo mismo con el contador...


Código :

stop();
sec = 45;
secText.text = sec;
timer = setInterval(countDown, 1000);
function countDown() {
 sec--;
 if (sec <= 0) {
   clearInterval(timer);
   secText.text = "0";
   _root.gotoAndPlay("tiempofuera");
 }
 secText.text = sec;
}



también probé ponerlo antes de que vuelva a cargar el timer, pero tampoco:


stop();
clearInterval(timer);
sec = 45;
secText.text = sec;
timer = setInterval(countDown, 1000);
function countDown() {
sec--;
if (sec <= 0) {
clearInterval(timer);
secText.text = "0";
_root.gotoAndPlay("tiempofuera");
}
secText.text = sec;
}


¿qué será?

Por jricardoar

10 de clabLevel



 

safari
Citar            
MensajeEscrito el 27 Oct 2008 05:18 pm
Con respecto al código que me pasaste,

Código :

function randomSerie(howMany){ 
   var a:Array = new Array() 
   var b:Array = new Array() 
   for(var i=1; i<=howMany; i++) a.push(i) 
   var total:Number = a.length 
   for(var i=0; i<total; i++) b.push(a.splice(int(Math.random()*a.length), 1)) 
   return b 
} 
//Ejemplo donde el botón newnumber llama a una serie de 12 
newnumber.onPress = function(){ 
   var serie = randomSerie(12) 
   trace(serie) 
} 



no entiedo cómo hacer para extrapolarlo a mi proyecto.
Es decir, ¿qué tedría que hacer para que esta función cargue un swf entre el rango (q1.swf:q32.swf) de acuerdo a su resultado aleatorio sin repetición?

Disculpame la insistencia, pero este código es bastante complejo para mí.

Gracias de nuevo!

Por jricardoar

10 de clabLevel



 

safari
Citar            
MensajeEscrito el 27 Oct 2008 05:52 pm
Haz un setInterval autocontenido

Código ActionScript :

stop();
sec = 45;
secText.text = sec;
timer = setInterval(function(w) {
 w.sec--;
 if (w.sec <= 0) {
   w.secText.text = "0";
   _root.gotoAndPlay("tiempofuera");
   clearInterval(timer);
 }
 w.secText.text = w.sec;
}, this, 1000);


Es mas tricky pero te aseguras que se autoborre

Para una serie de 1 a 32 haces

var serie = randomSerie(32)

Luego armas el primer elemento así:

mov1 = "q"+serie[0]+".swf"
trace(mov1)

Cada elemento del array serie tiene un nro de la serie, al que le agregas el resto de los strings que necesitas para formar el nombre de tu peli

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 27 Oct 2008 05:53 pm
sería algo así?


Código :

// en el frame que quiero que se cargue la película aleatoria

function randomSerie(howMany){ 
   var a:Array = new Array() 
   var b:Array = new Array() 
   for(var i=1; i<=howMany; i++) a.push(i) 
   var total:Number = a.length 
   for(var i=0; i<total; i++) b.push(a.splice(int(Math.random()*a.length), 1)) 
   return b 
} 
//Ejemplo donde el botón newnumber llama a una serie de 12 
this.onLoad = function(){ 
   var serie = randomSerie(12) 
   trace(serie) 
} 
preguntacontenedor.loadMovie("q" + serie + ".swf");


Obviamente, este código no funciona, pero es para ver si me pueden orientar.

Gracias!

Ricardo

Por jricardoar

10 de clabLevel



 

safari
Citar            
MensajeEscrito el 27 Oct 2008 06:21 pm
Jorge, estuve intentando con la explicación que me diste, y me sale "qundefined.swf" en el panel de salida.
Ya sé, estoy haciendo algo mal. Otra vez. jajajjaa...

El código asignado al frame EN EL QUE QUIERO QUE SE CARGUE EL SWF (lo pongo en mayúsculas porque creo que esto tiene algo que ver) es:

Código :

function randomSerie(howMany){ 
   var a:Array = new Array() 
   var b:Array = new Array() 
   for(var i=1; i<=howMany; i++) a.push(i) 
   var total:Number = a.length 
   for(var i=0; i<total; i++) b.push(a.splice(int(Math.random()*a.length), 1)) 
   return b 
} 
//Ejemplo donde el botón newnumber llama a una serie de 12 
newnumber.onPress = function(){ 
   var serie = randomSerie(32) 
   trace(serie) 
} 

mov1 = "q"+serie[0]+".swf"
trace(mov1) 


y bueno, en el panel de salida me dice qundefined.swf.
Después cambié el newnumber.onPress por un this.onLoad, ya que yo quiero que el swf se cargue solo, sin apretar nada, en ese fotograma.
Sigue diciendo "qundefined.swf" en el panel de salida.

También probé poniéndole lo siguiente:

Código :

preguntacontenedor.loadMovie("q"+serie[0]+".swf");

en reemplazo de

Código :

mov1 = "q"+serie[0]+".swf"
trace(mov1) 


y sigue diciendo "qundefined.swf"!


me estoy volviendo loco!

Por jricardoar

10 de clabLevel



 

safari
Citar            
MensajeEscrito el 27 Oct 2008 06:24 pm
Vale, venimos de falta de conocimiento de base, lo cual usualmente lleva a threads infinitamente largo porque uno intenta hacer cosas para lo cual no esta capacitado. Así que vamos desde el principio.

- La función devuelve un valor
- Ese valor debe ser creado y guardado en una variable
- Finalmente se usa

Entonces copia

Código ActionScript :

function randomSerie(howMany){ 
   var a:Array = new Array() 
   var b:Array = new Array() 
   for(var i=1; i<=howMany; i++) a.push(i) 
   var total:Number = a.length 
   for(var i=0; i<total; i++) b.push(a.splice(int(Math.random()*a.length), 1)) 
   return b 
} 

var serie = randomSerie(32) 
mov1 = "q"+serie[0]+".swf"
trace(mov1) 


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 27 Oct 2008 10:44 pm
Jorge, concuerdo totalmente con tu comentario, me faltan años luz con el flash!
Copié el código que me pasaste, pero no pasa nada cuando se ejecuta.

Simplemente nada.

si quieres ver los archivos, los subí a divshare:
http://www.divshare.com/download/5684437-8fd

El archivo principal es inicio.fla, es el que tiene que generar la carga aleatoria (reducido a 3 posibilidades, para mayor practicidad)
los archivos q1, q2, y q3.fla son las preguntas, que tienen el timer.

Gracias!

Ricardo

Por jricardoar

10 de clabLevel



 

safari
Citar            
MensajeEscrito el 27 Oct 2008 10:46 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 27 Oct 2008 10:53 pm
Jorge, me parece muy bien tu postura, no se me había ocurrido tal cosa.
Con lo anterior, tenés idea por qué puede ser que no pase nada?
el código lo estoy aplicando al frame en el que quiero que se cargue el swf aleatorio, ¿eso está bien?
¿o es mejor aplicarlo a un objeto?
¿o quizás debe estár en el primer frame de la película madre?

Saludos
Ricardo

Por jricardoar

10 de clabLevel



 

safari
Citar            
MensajeEscrito el 28 Oct 2008 12:42 am
Si en una peli en blanco pego en el primer y único fotograma este code:

Código ActionScript :

function randomSerie(howMany){  
   var a:Array = new Array()  
   var b:Array = new Array()  
   for(var i=1; i<=howMany; i++) a.push(i)  
   var total:Number = a.length  
   for(var i=0; i<total; i++) b.push(a.splice(int(Math.random()*a.length), 1))  
   return b  
}  
var serie = randomSerie(32)  
var mov1:String = "q"+serie[0]+".swf" 
trace(mov1)  


La traza saca algo así como

q9.swf

Siguiendo la regla q+nroaleatorio+.swf

Ahora bien, si yo quisiera trazar todos los elementos del array haría

Código ActionScript :

for(var i:Number = 0; i<serie.length; i++) trace("q"+serie[i]+".swf" )


Ahí te traza los 32 elementos sin repetir y en orden aleatorio. Luego queda entender, una vez que entiendes lo que hace (y como funciona) esta porción de código, seguramente no tendrás dificultad en aplicarlo a tu ejemplo

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

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