Foros del Web » Programación para mayores de 30 ;) » Programación General »

[SOLUCIONADO] Mínimo nro de la nave sobreviviente?

Estas en el tema de Mínimo nro de la nave sobreviviente? en el foro de Programación General en Foros del Web. Pseudocódigo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código a: Ver original Parte 1: Un objeto llamado jugador está presente. Establezco la defensa (Df) del jugador. Establezco el tamaño del ...
  #1 (permalink)  
Antiguo 01/12/2015, 14:38
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Mínimo nro de la nave sobreviviente?

Pseudocódigo:
Código a:
Ver original
  1. Parte 1:
  2. Un objeto llamado jugador está presente.
  3. Establezco la defensa (Df) del jugador.
  4. Establezco el tamaño del jugador, en base a su Df.
  5. Naves creadas (N) es 0.
  6.  
  7. Parte 2:
  8. N++
  9. Aparece nave enemiga nro N, en las coordenadas 0,0, es decir arriba a la izquierda.
  10. Se establece su Df, con cierto azar.
  11. Se establece su tamaño en base a su Df.
  12. Se establece su posición X (es 0 por defecto, como dije, pero se puede cambiar, y es lo que hago aquí), con azar aunque en los límites del ancho de mi pantalla (800).
  13. Se establece una velocidad para el jugador, 1+9/su Df.
  14. Se analiza qué flechas están presionadas y en base a ello el jugador se mueve hacia arriba, abajo, etc, diagonal arriba-derecha, etc.
  15. N2 = 1
  16. Para cada nave nro N2 mientras N sea mayor o igual que N:
  17.    Se mueve hacia abajo, a una velocidad de 1+9/su Df.
  18.    Si termina tocando al jugador
  19.       Si la Df del jugador > la Df de la nave
  20.          La Df del jugador aumenta en una cantidad igual a la Df de la nave.
  21.          Su tamaño aumenta correspondientemente.
  22.          La nave desaparece.
  23.       sino
  24.          Game over.
  25.       fin del si
  26.    sino si su ubicación es mayor de 700 (sería "muy abajo", fuera de la pantalla)
  27.       La nave desaparece.
  28.    fin del si
  29. fin del mientras
  30.  
  31. Parte 3:
  32. Ir a parte 2.
Básicamente se maneja una nave que debe "comer" (colisionar) a las más pequeñas que ella y evitar a las más grandes o iguales. Constantemente aparecen naves, así que de a poco el juego se va haciendo más lento, debido a la gran cantidad de naves en pantalla. Por supuesto quiero evitar ese enlentecimiento. Acabo de notar que podría convertir todo lo de parte 2 en una función e incluirla en la parte 3, de ese modo sucedería más seguido el proceso. Pero estoy interesado en pulir cierta idea, o ver si se puede pulir.

Antes de empezar el mientras, N2 se establece como 1. Si pudiera, en vez de poner ese valor, poner el valor del nro de la nave más vieja, el mientras funcionaría desde donde debe. O sea, si la nave nro 1, nro 2, etc, hasta 40, ya no están, entonces es inconveniente que el do se aplique a la nave 1 y demás, que ya no están! En este caso N2 debería iniciar con 40.

¿Pero cómo puedo tener marcado el nro de la mínima nave sobreviviente?

Por ahora lo que tengo es que inicialmente es 1. O sea, la nave nro 1 está en pantalla. Min=1. Lo defino en la parte 1 del código.
Cuando una nave desaparece, si su nro es Min entonces Min aumenta 1.
El problema es que uno puede destruir por ejemplo la 2 antes que la 1 y entonces según lo que he puesto, Min aumentaría a 2 cuando se destruya la 1, pero como la 2 ya está destruída entonces nunca aumentará a 3.

Puedo crear un "array" que marque qué naves fueron destruídas, pero quería saber si hay algo más sencillo que eso. Algo que requiera menos variables.

Gracias.

Si quieren les paso el código original y/o el juego, pero es un cuadrado y triángulos nomás, y es posible que graficamente no vaya a mejorarlo.
  #2 (permalink)  
Antiguo 01/12/2015, 16:18
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 14 años, 7 meses
Puntos: 12
Respuesta: Mínimo nro de la nave sobreviviente?

Hola

Este es un claro ejemplo que se soluciona muy fácilmente con programación orientada a objetos.

Personalmente he hecho más de un juego en el que no paran de aparecer y desaparecer enemigos y ,desde luego, recorrer todos los que se han creado desde el principio con un bucle, incluso los que se supone que ya ha desaparecido es una locura.

Lo que yo hago es ir creando nuevos enemigos y añadirlos a una lista, cuando un enemigo es destruido o sale de pantalla pues destruyo el objeto y lo saco de la lista, así, con un bucle que recorra la lista, siempre recorre los que actualmente hay, ni uno más.

Desde luego, de la forma que lo quieres hacer, no veo la manera.

Un saludo
  #3 (permalink)  
Antiguo 01/12/2015, 18:39
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mínimo nro de la nave sobreviviente?

Con tu método además evitas que se hagan cosas con naves que ya no están. Lo que yo estoy planteando en realidad no soluciona eso. Si la mínima nave existente es la 40 no se harán cosas con la 1, 2, etc, hasta ahí bien, pero puede que no exista la 41 y otras varias y se tratarían igual, por eso digo que en realidad mi método no soluciona eso. Esperaré un poco pero es probable que pruebe tu método o haga algo parecido. Lo que no me gusta es el tener que crear variables.
  #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

Etiquetas: Ninguno
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 01:30.