Comunidad de diseño web y desarrollo en internet online

Problema con variable dinámica. Error #1056

Citar            
MensajeEscrito el 13 Sep 2012 09:40 pm
Hola a todos como verán soy nuevo en cristalab pero no en ActionScript. Gracias de antemano por su ayuda.

Tengo un problema con la creación de una variable dinámica en tiempo de ejecución. Es un juego flash de naipes.

Esto me muestra el panel salida:
"ReferenceError: Error #1056: No se puede crear la propiedad jugador2.carta1"

Bueno el código no es muy claro así que voy a tratar de explicarlo:

En primer lugar cree dos clases dentro del mismo directorio. 1- Jugador.as, la cual tiene una propiedad carta1, 2, 3. Las cuales guardan un tipo de dato Naipe. Esta última es la segunda clase, que extiende MC. El constructor Naipe recibe dos parámetros. 1-El número y 2-El palo o pinta( ej: CORAZON)

Lo que pretendo hacer es lo siguiente, lo cual funciona a la perfección:

Código ActionScript :

      public function repartirMazo()
      {
         //asignar a variable jugador1 las cartas nº 1, 3 y 5
         //asignar a variable jugador2 las cartas nº 2, 4 y 6
                       //Ej mazo[0]=[1, "TREBOL"]
         jugador2.carta1 = new Naipe(mazo[0][0],mazo[0][1]);
         jugador1.carta1 = new Naipe(mazo[1][0],mazo[1][1]);
         jugador2.carta2 = new Naipe(mazo[2][0],mazo[2][1]);
         jugador1.carta2 = new Naipe(mazo[3][0],mazo[3][1]);
         jugador2.carta3 = new Naipe(mazo[4][0],mazo[4][1]);
         jugador1.carta3 = new Naipe(mazo[5][0],mazo[5][1]);
      }


No obstante me resultó incomodo tantas líneas así que preferí hacer dos bucles para obtener el mismo resultado. He chequeado las operaciones aritméticas y están correctas.



Código ActionScript :

      public function repartirMazo()
      {
         for (var i:uint = 0; i <= 4; i +=  2)
         {
            for (var j:uint = 2; j >= 1; j--)
            {
                                // AQUÍ ESTÁ EL CONFLICTO
            this[  "jugador" +  j  + ".carta" + ((0.5 * i) + 1)  ] = new Naipe( mazo[i+((-1*j)+2)][0], mazo[i+((-1*j)+2)][1] );

            }
         }

      }



Bueno en sí no estoy creando una variable, la variable ya existe, así como también la propiedad carta1. Esta última no está definida al comienzo del bucle. Aquí el problema es con la asignación de un tipo de dato MovieClip en una variable de tipo Object.



Eso es todo espero que me puedan ayudar. Gracias

Por viroguitar

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 14 Sep 2012 12:25 pm
0.5 por un entero mas uno da siempre con decimal, porque no veo que lo castees a integer, eso ya lo veo raro. Luego usaria

jugador["carta"+....]

En la notaci[on de Array. Finalmente si son esas 6 líneas, es muchísimo mas claro que el loop esotérico que hiciste, que se justificaría si fuesen 100 cartas.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 14 Sep 2012 01:35 pm

solisarg escribió:

0.5 por un entero mas uno da siempre con decimal, porque no veo que lo castees a integer, eso ya lo veo raro. Luego usaria

jugador["carta"+....]

En la notaci[on de Array. Finalmente si son esas 6 líneas, es muchísimo mas claro que el loop esotérico que hiciste, que se justificaría si fuesen 100 cartas.

Jorge



Hola jorge gracias por responder. Nota que la variable "i" toma tres valores: 0, 2 y 4. Gracias a eso todas las operaciones posibles no dan "decimales".

(0.5 * x)+1 = y

(0.5 * 0)+1 = y
(0)+1 = y
1 = y

(0.5 * 2)+1 = y
(1)+1 = y
2 = y


(0.5 * 4)+1 = y
(2)+1 = y
3 = y

El sentido de esta operación es justamente aprovechar la variable "i" para modificar el nombre de la propiedad carta a carta1, carta2 o carta3 (carta + y).

Por otro lado, quería evitarme lo siguiente. No son 100 cartas pero no me parece un código bien producido:

Código ActionScript :

      public function repartirMazo()
      {
         //asignar a variable jugador1 las cartas nº 1, 3 y 5
         //asignar a variable jugador2 las cartas nº 2, 4 y 6
         //Ej mazo[0]=[1, "TREBOL"]
         jugador2.carta1 = new Naipe(mazo[0][0],mazo[0][1]);
         jugador1.carta1 = new Naipe(mazo[1][0],mazo[1][1]);
         jugador2.carta2 = new Naipe(mazo[2][0],mazo[2][1]);
         jugador1.carta2 = new Naipe(mazo[3][0],mazo[3][1]);
         jugador2.carta3 = new Naipe(mazo[4][0],mazo[4][1]);
         jugador1.carta3 = new Naipe(mazo[5][0],mazo[5][1]);

         jugador2.carta1.gotoAndStop(mazo[0][0]+" "+mazo[0][1]);
         jugador1.carta1.gotoAndStop(mazo[1][0]+" "+mazo[1][1]);
         jugador2.carta2.gotoAndStop(mazo[2][0]+" "+mazo[2][1]);
         jugador1.carta2.gotoAndStop(mazo[3][0]+" "+mazo[3][1]);
         jugador2.carta3.gotoAndStop(mazo[4][0]+" "+mazo[4][1]);
         jugador1.carta3.gotoAndStop(mazo[5][0]+" "+mazo[5][1]);

         jugador2.carta1.x = ;
         jugador2.carta1.y = ;         
         jugador1.carta1.x = ;
         jugador1.carta1.y = ;         
         jugador2.carta2.x = ;
         jugador2.carta2.y = ;         
         jugador1.carta2.x = ;
         jugador1.carta2.y = ;         
         jugador2.carta3.x = ;
         jugador2.carta3.y = ;         
         jugador1.carta3.x = ;
         jugador1.carta3.y = ;
         
         jugador2.carta1.width = ;
         jugador2.carta1.height = ;         
         jugador1.carta1.width = ;
         jugador1.carta1.height = ;         
         jugador2.carta2.width = ;
         jugador2.carta2.height = ;         
         jugador1.carta2.width = ;
         jugador1.carta2.height = ;         
         jugador2.carta3.width = ;
         jugador2.carta3.height = ;         
         jugador1.carta3.width = ;
         jugador1.carta3.height = ;         
      }


Imagina hacer 6 veces todo.... Agregarle detectores de evento, removerlo, etc....Me parece demasiado extenso. Y de una forma dinámica me hubiera ocupado 6 veces menos líneas.

No sé como debería tomar el calificativo de "esotérico": Hubiese preferido que fuera mas legible...

Por viroguitar

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 14 Sep 2012 05:50 pm
Mejoré el código agregando a la clase Naipe funciones para establecer las propiedades .width .height y el método .gotoAndStop(). Así quedó pero igual sigo teniendo el mismo problema:

Código ActionScript :

      public function repartirMazo()
      {
         jugador2.carta1 = new Naipe(mazo[0][0],mazo[0][1]);
         jugador1.carta1 = new Naipe(mazo[1][0],mazo[1][1]);
         jugador2.carta2 = new Naipe(mazo[2][0],mazo[2][1]);
         jugador1.carta2 = new Naipe(mazo[3][0],mazo[3][1]);
         jugador2.carta3 = new Naipe(mazo[4][0],mazo[4][1]);
         jugador1.carta3 = new Naipe(mazo[5][0],mazo[5][1]);

         for (var i:uint = 0; i <= 4; i +=  2)
         {
            for (var j:uint = 2; j >= 1; j--)
            {
               //jugador2.carta1.x= 60;
               this["jugador" + j + ".carta" + ((0.5 * i) + 1)].x = 60 * ((0.5 * i) + 1);
               this["jugador" + j + ".carta" + ((0.5 * i) + 1)].y = 100 * ((2.7 * j) - 2.4);
               
            }
         }
      }




Salida:

Código ActionScript :

ReferenceError: Error #1069: No se encontró la propiedad jugador2.carta1 en Truco y no hay ningún valor predeterminado.

Por viroguitar

10 de clabLevel



 

chrome

 

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