Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/12/2015, 12:35
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mínimo nro de la nave sobreviviente?

En teoría encontré una solución pero hay un error cuya causa no entiendo. El error es que, llegado un punto, a veces aparecen naves que desaparecen enseguida.
Código a:
Ver original
  1. actions for fotograma 1
  2.       Player.Df = 100;
  3.       setProperty (Player, _xscale, 100+Player.Df/100);
  4.       setProperty (Player, _yscale, 100+Player.Df/100);
  5.       N = 0;
  6.    actions for fotograma 2
  7.       // Aparece nave.
  8.       N = N+1;
  9.       Res = "Nave"+N;
  10.       Resu = Res+".Df";
  11.       attachMovie("Nave", Res, N);
  12.       trace ("Nave"+N+" agregada");
  13.       set (Resu, random(N)+1);
  14.       EvaledResu = eval(Resu);
  15.       setProperty (Res, _x, random(799)+1);
  16.       setProperty (Res, _xscale, 100+EvaledResu/10);
  17.       setProperty (Res, _yscale, 100+EvaledResu/10);
  18.       // Movimiento del jugador.
  19.       Player.Sp = 1+9/Player.Df;
  20.       if (Key.isDown(Key.LEFT)) {
  21.          if (Key.isDown(Key.UP)) {
  22.             V = Math.sqrt(Player.Sp*Player.Sp/2);
  23.             Player._x = Player._x-V;
  24.             Player._y = Player._y-V;
  25.          } else if (Key.isDown(Key.DOWN)) {
  26.             V = Math.sqrt(Player.Sp*Player.Sp/2);
  27.             Player._x = Player._x-V;
  28.             Player._y = Player._y+V;
  29.          } else {
  30.             Player._x = Player._x-Player.Sp;
  31.          }
  32.       } else if (Key.isDown(Key.RIGHT)) {
  33.          if (Key.isDown(Key.UP)) {
  34.             V = Math.sqrt(Player.Sp*Player.Sp/2);
  35.             Player._x = Player._x+V;
  36.             Player._y = Player._y-V;
  37.          } else if (Key.isDown(Key.DOWN)) {
  38.             V = Math.sqrt(Player.Sp*Player.Sp/2);
  39.             Player._x = Player._x+V;
  40.             Player._y = Player._y+V;
  41.          } else {
  42.             Player._x = Player._x+Player.Sp;
  43.          }
  44.       } else if (Key.isDown(Key.UP)) {
  45.          Player._y = Player._y-Player.Sp;
  46.       } else if (Key.isDown(Key.DOWN)) {
  47.          Player._y = Player._y+Player.Sp;
  48.       }
  49.       // Movimiento de las naves.
  50.       N2 = 1;
  51.       do {
  52.          Res = "Nave"+N2;
  53.          NaveDf = eval(Res+".Df");
  54.          setProperty (Res, _y, getProperty(Res, _y)+1+9/eval(Res+".Df"));
  55.          trace (Res+" se movió");
  56.          if (Player.hitTest(eval(Res)) == true) {
  57.             // Contacto.
  58.             if (Player.Df>NaveDf) {
  59.                Player.Df = Player.Df+NaveDf;
  60.                setProperty (Player, _xscale, 100+Player.Df/100);
  61.                setProperty (Player, _yscale, 100+Player.Df/100);
  62.                removeMovieClip (Res);
  63.                trace (Res+" removida");
  64.                setProperty ("Nave"+N, _name, "Nave"+N2);
  65.                trace ("Nave"+N+" transformada en Nave"+N2);
  66.                if (N>1) {
  67.                   N = N-1;
  68.                   N2 = N2-1;
  69.                }
  70.             } else {
  71.                stop ();
  72.             }
  73.          } else if (getProperty(Res, _y)>700) {
  74.             // Fuera de la pantalla.
  75.             removeMovieClip (Res);
  76.             trace (Res+" removida");
  77.             setProperty ("Nave"+N, _name, "Nave"+N2);
  78.             trace ("Nave"+N+" transformada en Nave"+N2);
  79.             if (N>1) {
  80.                N = N-1;
  81.                N2 = N2-1;
  82.             }
  83.          }
  84.          N2 = N2+1;
  85.       } while (N>=N2);
  86.       stop ();
  87.    actions for fotograma 3
  88.       gotoAndPlay (2);
Lo que se me ocurrió fue dar a la última nave agregada el nombre de la removida. Básicamente es esto (está incluído en el code de arriba):
Código a:
Ver original
  1. removeMovieClip (Res);
  2.             trace (Res+" removida");
  3.             setProperty ("Nave"+N, _name, "Nave"+N2);
  4.             trace ("Nave"+N+" transformada en Nave"+N2);
  5.             if (N>1) {
  6.                N = N-1;
  7.                N2 = N2-1;
  8.             }
Se remueve la nave que corresponda (lo citado es de un evento en que debe removerse, sea porque se salió de la pantalla o tocó la nave del jugador). Luego, la última que se agregó toma su nombre. Digamos que se removió Nave1 y la última es Nave72, lo que sucede con esto es que ahora la Nave72 pasa a llamarse Nave1. N marca el nro de naves en pantalla y N2 es el contador del while, marca qué nave se está analizando. El if sinceramente no entiendo bien si está bien o no, pero dudo que sea el problema, pues el único caso en que no se aplicaría es que la cantidad de naves en pantalla sea 1, cosa que rara vez puede ocurrir.
https://dl.dropboxusercontent.com/u/169164922/9.swf

No sé, voy a probar insertar las naves con números en ellas a ver si veo mejor qué pasa, si la que desaparece es sustituída (¿debería no reducir N2?) o qué.

N se reduce porque hay una nave menos.
N2 se reduce porque ahora hay una nueva naveN2, o sea que debe analizarse.

Quizá el problema ocurre cuando la nave eliminada es N...
Supongamos que N y N2 son 70.
Se elimina la nave N2.
La nave N toma el valor de N2.
¡Pero ya no existe!

No entiendo cómo ese error puede causar una aparición y luego una desaparición, pero en fin, seguiré investigando.

EDIT:
Ok, hice lo de ponerles números que se vieran en pantalla, y también separé el while en frames, para ver mejor paso por paso qué pasaba (lo intenté con trace pero no me había servido, posiblemente lo hice mal). Así medio por casualidad noté algo que podría explicar el error: El depth no cambia.

La nave N2 tiene un depth N. Al insertar una nave N con un depth N, hace que la nave N2 con depth N desaparezca, aunque no sea de nombre N.
Solución posible: No asignar N al depth, crear otra variable.

Pero esto también parece que sirve:
eval(Res+".swapDepths")("Nave"+N);

A decir verdad lo de la propiedad _name se me ocurrió también medio por casualidad, porque la había visto recientemente buscando otra cosa.

Última edición por Tachikomaia; 04/12/2015 a las 14:57