Comunidad de diseño web y desarrollo en internet online

Actionscript 2.0 preguntas aleatorias.

Citar            
MensajeEscrito el 17 Mar 2009 06:22 pm
Saludos a todos, este es mi primer post (ya había consultado estos foros muchas veces antes y hasta hoy me registré) y lo publico principalmente porque no encuentro cómo resolver un problema, el asunto es el siguiente:

Realizo un multimedia dirigido a niños en el que en una de las actividades aparece un cuestinario de "sí" o "no", realmente poner preguntas y programar para que aparezca si es correcto o incorrecto lo que respondieron es sencillo, pero lo que busco es generar el cuestionario aleatoriamente desde un archivo XML, básicamente el asunto es que lea el XML, saque una pregunta, compare si ya apareció, si ya lo hizo, que elija otra y así hasta que encuentre una no usada, luego, que esa pregunta la asigne a un campo de texto dinámico y como cada pregunta viene anidada con otro campo de texto, también lo lea y si es cierto valor, entonces "Sí" es la respuesta correcta, si es el otro valor, "No" es la correcta. Son 6 preguntas las que se eligen y el mismo número aparece en el XML, sólo se cambia el orden en que aparecen.

El problema es que cuando corro el multimedia, me aparece "undefined", el código en el fotograma clave es:

stop();
stopAllSounds(); //sonidos
fondo.gotoAndStop(2); //fondo de pantalla
//definición random
function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}
comparador = new Array(); //variable que valida si ya se asignó la pregunta actual
preguntas = new Array(); // array que almacena las preguntas
respuestas = new Array(); //array que almacena las respuestas
//xml
var pregoso:XML = new XML();
pregoso.ignoreWhite = true;
for (var i=0; i<=5; i++) { //ciclo para asginar las 6 preguntas al azar
var aleat:Number = randRange(0, 5); //número aleatorio
for (var a = 0; a<=5; a++) { //ciclo que valida que no se repitan las preguntas
if (comparador[a]!=aleat){
var miXML:XMLNode = this.firstChild.childNodes[aleat];
preguntas[i]= miXML.childNodes[0].firstChild.nodeValue; //se asgina la pregunta del XML
respuestas[i]= miXML.childNodes[1].firstChild.nodeValue; //se asigna la respuesta
comparador [i]= aleat; //se le dice que ese número de pregunta ya apareció.
}
}
}
//asignación de preguntas a texto dinámico
p_oso0.text = "preguntas[0]"; //lo hice sólo para comprobar y efectivamente aparece el texto tal cual
p_oso1.text = preguntas[1]; //se asigna el valor del array al campo de texto dinámico
p_oso2.text = preguntas[2];
p_oso3.text = preguntas[3];
p_oso4.text = preguntas[4];
p_oso5.text = preguntas[5];

El XML contiene lo siguiente:

<preguntasOso>
<pregunta>
<frase>Polar Bears swim.</frase>
<valor>Y</valor>
</pregunta>
<pregunta>
<frase>Polar Bears eat fish.</frase>
<valor>Y</valor>
</pregunta>
<pregunta>
<frase>Polar Bears have fur.</frase>
<valor>Y</valor>
</pregunta>

<pregunta>
<frase>Polar Bears have cubs.</frase>
<valor>Y</valor>
</pregunta>
<pregunta>
<frase>Polar Bears play.</frase>
<valor>Y</valor>
</pregunta>
<pregunta>
<frase>Polar Bears have feathers.</frase>
<valor>Y</valor>
</pregunta>
</preguntasOso>

Debo aclarar que soy principiante usando XML y para esto estuve leyendo tutoriales e interpretando sentencias y demás, así que sé que podría estar mal en algo muy básico, pero no logro verlo, espero me ayuden.

Por cierto, no he agregado el código para que a partir de la variable "respuestas" se asigne el valor a los botones de respuesta. Agradesco el tiempo que tomaron en leer esto.

Por Jimus

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Mar 2009 05:10 am
Si, como decias, es basico, creas el XML, pero nunca cargas tu archivo externo.

Código ActionScript :

var pregoso:XML = new XML();
pregoso.ignoreWhite = true;
pregoso.load("tu_xml.xml");
pregoso.onLoad = function( ok )
{
   if( ok )
   {
      //Acciones que se ejecutan cuando el XMl este cargado.
   }
}


Suerte.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 18 Mar 2009 05:19 am
¡Muchas gracias!, ahora mismo lo pruebo a ver si ya funciona, luego de eso paso a ver si ya está resuelto, gracias de nueva cuenta.

Por Jimus

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Mar 2009 07:06 am
:shock: No funciona, agregué ese código y quedó (esa parte) así:

Código :

var pregoso:XML = new XML();
pregoso.ignoreWhite = true;
pregoso.load("preguntas oso.xml"); 
pregoso.onLoad = function( ok ) 
{ 
   if( ok ) 
   { 
      for (var i=0; i<=5; i++) {
         var aleat:Number = randRange(0, 5);
         for (var a = 0; a<=5; a++) {
            if (comparador[a]!=aleat){
               var miXML:XMLNode = this.firstChild.childNodes[aleat];
               preguntas[i]= miXML.childNodes[0].firstChild.nodeValue;
               respuestas[i]= miXML.childNodes[1].firstChild.nodeValue;
               comparador [i]= aleat;
               }
         }
      }
   }
}


Sigue apareciendo Undefined, ¿las instrucciones del recorrido dentro del XML estarán mal planteadas o qué tengo mal?

Por Jimus

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Mar 2009 08:57 pm
Seria algo masomenos asi:

Código ActionScript :

stop();
stopAllSounds(); //sonidos
fondo.gotoAndStop(2); //fondo de pantalla

comparador = new Array(); //variable que valida si ya se asignó la pregunta actual
preguntas = new Array(); // array que almacena las preguntas
respuestas = new Array(); //array que almacena las respuestas

var pregoso:XML = new XML();
pregoso.ignoreWhite = true;
pregoso.load("preguntas oso.xml"); 
pregoso.onLoad = function( ok ) 
{ 
   if( ok ) 
   { 
      Init();
   }
}

function Init( Void ):Void
{
   for (var i=0; i<=5; i++) 
   {
      var aleat:Number = randRange(0, 5);
      for (var a = 0; a<=5; a++) 
      {
         if (comparador[a] != aleat)
         {
            var miXML:XMLNode = pregoso.firstChild.childNodes[aleat];
            preguntas[i] = miXML.childNodes[0].firstChild.nodeValue;
            respuestas[i] = miXML.childNodes[1].firstChild.nodeValue;
            comparador[i] = aleat;
         }
      }
   }
   //asignación de preguntas a texto dinámico
   p_oso0.text = "preguntas[0]"; //lo hice sólo para comprobar y efectivamente aparece el texto tal cual
   p_oso1.text = preguntas[1]; //se asigna el valor del array al campo de texto dinámico
   p_oso2.text = preguntas[2];
   p_oso3.text = preguntas[3];
   p_oso4.text = preguntas[4];
   p_oso5.text = preguntas[5];
}

function randRange(min:Number, max:Number):Number
{
   return Math.floor(Math.random() * (max - min + 1)) + min;
}

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 21 Mar 2009 04:56 pm
¡Muchas gracias!, lo probé y efectivamente así saca las preguntas, ahora el asunto es que aparecen algunas repetidas y la idea es que ninguna de las 6 sea igual a otra, según yo comparando el valor de la variable que almacena los valores antes generados por el aleatorio con los nuevos valores de éste, dal a pauta para obligarle a cambiar hasta que encuentre uno que no haya salido, pero pasa aún así.

Otra cosa, habrá botones de sí y no (y0,y1,y2...y5, n0, n1...n5), unos gráficos que muestran cuando la respuesta es correcta, una por cada pregunta (pal0,pal2...pal5) y un texto que reacciona acorde a la respuesta (msg), se supone que una vez que leyó la pregunta el el valor de la respuesta anexo a él, se comparará y a partir de ahí se dirá cuál de los dos botones es el correcto, mostrará el gráfico cuando presione dicho botón, el mensaje de bien hecho aparecerá; si presiona el otro, aparecerá un mensaje diciendo que intente otra vez (están en inglés porque es de una clase en ese idioma, no soy mañas mías), el código con todo y las correciones queda así:

Código :

stop(); 
stopAllSounds(); //sonidos 
fondo.gotoAndStop(2); //fondo de pantalla 
 
comparador = new Array(); //variable que valida si ya se asignó la pregunta actual 
preguntas = new Array(); // array que almacena las preguntas 
respuestas = new Array(); //array que almacena las respuestas 
 
var pregoso:XML = new XML(); 
pregoso.ignoreWhite = true; 
pregoso.load("preguntas oso.xml");  
pregoso.onLoad = function( ok )  
{  
   if( ok )  
   {  
      Init(); 
   } 
} 
 
function Init( Void ):Void 
{ 
   for (var i=0; i<=5; i++)  
   { 
      var aleat:Number = randRange(0, 5); 
      for (var a = 0; a<=5; a++)  
      { 
         if (comparador[a] != aleat) 
         { 
            var miXML:XMLNode = pregoso.firstChild.childNodes[aleat]; 
            preguntas[i] = miXML.childNodes[0].firstChild.nodeValue; 
            respuestas[i] = miXML.childNodes[1].firstChild.nodeValue; 
            comparador[i] = aleat; 
         } 
      } 
   } 
   //asignación de preguntas a texto dinámico 
   p_oso0.text = preguntas[0];
   p_oso1.text = preguntas[1]; //se asigna el valor del array al campo de texto dinámico 
   p_oso2.text = preguntas[2]; 
   p_oso3.text = preguntas[3]; 
   p_oso4.text = preguntas[4]; 
   p_oso5.text = preguntas[5]; 
} 
 
function randRange(min:Number, max:Number):Number 
{ 
   return Math.floor(Math.random() * (max - min + 1)) + min; 
} 
pal0._visible=false;
if (respuestas[0]=="Y"){
   y0.onRelease=function(){
      pal0._visible=true;
      msg="Good Work!";
      }
   }
if (respuestas[0]=="N"){
   n0.onRelease=function(){
      pal0._visible=true;
      msg="Good Work"
      }
   }
else{
   msg="Try Again"
   }


Puse sólo probando uno para saber si funcionaba (sí, el código es algo burdo y de hecho, se extenderá demasiado si pongo para todas las preguntas) y no lo hizo, así que, ahora hay dos problemas (creo que yo me voy volviendo un problema para LongeVie (gracias por la atención, en serio que voy puliendo cosas gracias a tu ayuda).

Por Jimus

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Mar 2009 11:01 pm
Yo te recomiendo que llenes el array de forma normal, y luego hagas un random al array, me refiero a esto:

Código ActionScript :

stop(); 
stopAllSounds(); //sonidos 
fondo.gotoAndStop(2); //fondo de pantalla 
 
preguntas = new Array(); // array que almacena las preguntas
 
var pregoso:XML = new XML(); 
pregoso.ignoreWhite = true; 
pregoso.load("preguntas oso.xml");  
pregoso.onLoad = function( ok )  
{  
   if( ok )  
   {  
      Init(); 
   } 
} 
 
function Init( Void ):Void 
{ 
   for (var i = 0; i <= pregoso.firstChild.childNodes.length; i++)  
   { 
       var miXML:XMLNode = pregoso.firstChild.childNodes[i]; 
       preguntas.push({ pregunta:miXML.childNodes[0].firstChild.nodeValue, respuesta:miXML.childNodes[1].firstChild.nodeValue});
   } 
   //Aleatorio
   preguntas = preguntas.sort(shuffle);

   //asignación de preguntas a texto dinámico 
   p_oso0.text = preguntas[0].pregunta;
   p_oso1.text = preguntas[1].pregunta; //se asigna el valor del array al campo de texto dinámico 
   p_oso2.text = preguntas[2].pregunta; 
   p_oso3.text = preguntas[3].pregunta; 
   p_oso4.text = preguntas[4].pregunta; 
   p_oso5.text = preguntas[5].pregunta; 
}
 
function shuffle(a,b):Number
{
    return Math.round( Math.random() * 2 ) - 1;
}

pal0._visible=false;
if (preguntas[0].respuesta=="Y"){
   y0.onRelease=function(){
      pal0._visible=true;
      msg="Good Work!";
      }
   }
if (preguntas[0].respuesta=="N"){
   n0.onRelease=function(){
      pal0._visible=true;
      msg="Good Work"
      }
   }
else{
   msg="Try Again"
   }

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 24 Abr 2009 08:37 pm
Ya implementé el código con las correciones que hiciste y efectivamente funciona, sólo que en ocasiones aparece el Undefined, ¿tienes idea de poqué pueda ser?, ¿habrá algún error en la lectura de nodos?

Por Jimus

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Abr 2009 09:20 pm
Podria ser problema del XML. Seria cuestion de revisarlo.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox

 

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