Comunidad de diseño web y desarrollo en internet online

¿Mejor forma de ponerle un array?

Citar            
MensajeEscrito el 21 Mar 2013 11:25 am
Quisiera añadir a mi juego en ActionScript2 algo así como las monedas grandes de los juegos de mario. Quiero decir, que si cojo la moneda, y cierro el swf, ya la moneda no aparezca más. Pero soy novato y tan sólo he sido capaz de hacer desaparecer una moneda eficazmente y también de añadir otro objeto que, al tocarlo, limpia el sharedObject grabado.
Me gustaría aplicar un array para tener más monedas por nivel, y no sólo una. Si alguien pudiese explicarme cómo puedo aplicarle el array y cómo funcionaría en este caso, le estaría bastante agradecido.
Aquí está el swf:




y aquí está mi código:

Código ActionScript :

  var mySo:SharedObject = SharedObject.getLocal( "variasMonedas" );
var xPos = 275;
var yPos = 200;
_root.a_recoger._visible = false;

if (mySo.data.monedasAcoger == undefined){
trace("aún no la has cogido");
_root.a_recoger._visible = true;
}else if (mySo.data.monedasAcoger == 1)
trace ("ya la cogiste");

if (mySo.data.monedasAcoger == undefined) {
   attachMovie("la_moneda","moneda1",this.getNextHighestDepth(), {_x:xPos, _y:yPos});
}else 
{
_root.moneda1.unloadMovie;
}
attachMovie("el_reset","reinicio",this.getNextHighestDepth(), {_x:475, _y:yPos});

onEnterFrame = function() {
if (_root.jugador.hitTest(_root.moneda1))
   {
      _root.moneda1.gotoAndStop(2);;
      _root.moneda1.unloadMovie;
      mySo.data.monedasAcoger = 1;
      trace(mySo.data.monedasAcoger);
   }
mySo.flush();
if (_root.jugador.hitTest(_root.reinicio))
   {
      _root.reinicio.gotoAndStop(2);
      mySo.clear();
   }
}

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 Mar 2013 11:45 am
Parece que con el anterior servidor no salía el swf. Aquí está:


Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 Mar 2013 12:55 pm
Siempre digo que los juegos son de las cosas mas difíciles de programar y a la vez mas atractivas de hacer. Cuando planteaste esto mismo en un POST anterior te propuse un ejercicio con dos monedas y botones. Esto permite aislar el problema, practicar estructuras de datos + SO sin mezclar con el resto de las mecánicas que implica un juego completo.
Tips para el ejercicio:

- la posición de las monedas deben ser calculadas por formula, de manera que haya una variable donde simplemente pongas la cantidad de monedas
- con un botón haces desaparecer de a una las monedas, preferencetemente en forma aleatoria
- el SO es básicamente un array de unos y ceros representando si la moneda existe o no

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 Mar 2013 01:12 pm
Pues tienes razón en una cosa: es bastante adictivo el construir un juego, pero un quebradero de cabeza del copón. He tenido problemas con la pausa del sonido (solucionado), también he tenido problemas con el salto personalizado (solucionado también) e incluso algún problemilla con el la función de pausa del temporizador del juego, pero cuando me tropecé con el array (no tenía la suerte de conocerlo en persona) ya no me he vuelto a levantar.
Tienes razón también en que cuando tienes un problema, hay que aislarlo, para encontrar una solución. Y creo que ya voy por buen camino, ya que la posición de los dos objetos que muestro en pantalla son calculadas desde el attachmovie (por código). Y muchísimas gracias por los pasos, voy a intentar hacerlo exactamente como sugieres, ya que parece la forma más lógica de aprenderlo y aplicarlo en el juego posteriormente.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 09:51 am
He hecho los deberes y he puesto todo el código en un frame. Ahora me estoy dando cuenta realmente de la eficacia y de los recursos en memoria que le ahorras al ordenador si lo haces así, y no te hinchas a poner onEnterFrame a diestro y siniestro. Bueno, también estudié los arrays y los bucles for. Rehice mi código, pero ahora no desaparece ninguna moneda cuando la toca el jugador, y no encuentro el fallo por ningún lado...


Código ActionScript :

var miArray1:Array = [[1],[1],[1],[1],[1]];
var miSO = SharedObject.getLocal("las_monedas");
miSO.data.miArray1grabado = miArray1;
trace ("valor de los datos grabados iniciales = " + miSO.data.miArray1grabado);

var xPos = 275;
var yPos = 55;

attachMovie("la_bola", "bola", this.getNextHighestDepth(),{_x:121, _y:yPos});

var len = miSO.data.miArray1grabado.length;
for (i = 0; i <len; i++)
{
           //pone en escenario los clips de moneda
   attachMovie("la_moneda","monNVL1_" + i, this.getNextHighestDepth(),{_x:xPos, _y:yPos});
   //incrementa la posición en y de los clips de moneda en cada pase de bucle
   yPos += this["monNVL1_" + i]._height + 5;

   trace(miSO.data.miArray1grabado[i]);
}
for (i = 0; i <len; i++)
{
   if (bola.hitTest(this["monNVL_" + i])) 
   {
      miSO.data.miArray1grabado[i] = 0;
                this["monNVL1_" + i].unloadMovie();
                miSO.flush();
     
     }
   }


Una ayudita, por favor, que estamos en Semana Santa :cry:

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 12:13 pm
Le he hecho otra mejora, pero sin resultado. El jugador sigue pasando por encima de las monedas y éstas no desaparecen ni hacen nada... :?

Código ActionScript :

var miArray1:Array = [1, 1, 1, 1, 1];
var monedasArray1:Array = [];
var miSO = SharedObject.getLocal("las_monedas");
if (miSO.data.miArray1grabado != null)
{
   miArray1 = miSO.data.miArray1grabado;
}

var xPos = 275;
var yPos = 55;

attachMovie("la_bola","bola",this.getNextHighestDepth(),{_x:121, _y:yPos});

var len = miArray1.length;
for (var i = 0; i < len; i++)
{
   var moneda:MovieClip = attachMovie("la_moneda", "coinNVL1_" + i, this.getNextHighestDepth(), {_x:xPos, _y:yPos});
   monedasArray1.push(moneda);
   yPos += moneda._height + 5;
}

onEnterFrame = function ()
{
   var len = monedasArray1.length;
   for (var i = 0; i < len; i++)
   {
      if (monedasArray1[i] != null)
      {
         var moneda:MovieClip = monedasArray1[i];
         if (bola.hitTest(moneda))
         {
            //quita la moneda, y fija su valor a 0 en el SO.
            moneda.unloadMovie;
            miArray1[i] = 0;
            monedasArray1[i] = null;
            miSO.data.miArray1grabado = miArray1;
            miSO.flush();
         }
      }
   }
};

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 12:54 pm
Lo contrario a attachMovie es removeMovieClip, unloadMovie es lo contrario de loadMovie.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2013 01:01 pm
Pues sigue igual, Jorge. Cambié el unloadMovie por removeMovieClip y nanai de la china.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 01:16 pm
No veo donde mueves la bola, pero haza mover muuuuy lento para asegurarte que el hitTest se produzca (hitTest es un poco lento para juegos de acción) y mira que pasa. Comienza a agregar trace por ejemplo dentro del hitTest para ver si se produce.

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2013 01:33 pm
La cosa es que le planto el trace(miArray1[i]); y cuando toca la moneda el output me transmite que es igual a cero. Pero la dichosa moneda no desaparece. El código de la bola lo tengo en la función onEnterFrame, pero no lo añadí aquí para que no se vea demasiado largo el código.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 05:05 pm
Cuando digo trace es algo así

Código ActionScript :

if (bola.hitTest(moneda))
         {
          trace("contacto con moneda "+moneda)
          (.....)
         }


Si sale el trace pero la moneda no desaparece, entonces miramos si moneda.removeMovieClip() está apuntando en la dirección correcta, pero si no sale el trace en la ventana de output, entonces ni siquiera tenemos colisión

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2013 06:25 pm
Pues al tocar las 5 monedas, una por una de arriba hacia abajo aparece esto:

contacto con moneda _level0.coinNVL1_0
contacto con moneda _level0.coinNVL1_1
contacto con moneda _level0.coinNVL1_2
contacto con moneda _level0.coinNVL1_3
contacto con moneda _level0.coinNVL1_4

Parece que si hay colisión.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 06:38 pm
Ok, entonces corrijamos lo de dentro

miArray1[i] = 0;
removeMovieClip(moneda)

Eso es todo, no hay que nullificar el elemento del array (ya que debe ser 0) ni guardarlo cada vez que desaparece una moneda, sino estás haciendo operaciones I/O todo el tiempo, guarda cuando termina el nivel o cuando le da al botón de guardar

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2013 06:56 pm
¡¡¡¡¡¡¡¡¡Muchas gracias, Jorge!!!!!!!!! Ahora, al menos, desaparecen. Pero al cerrar y abrir el swf vuelven a estar las monedas que he cogido. El rumbo de mi juego es una vuelta de tuerca a lo que ya hay en el mercado, por eso necesito que, si el personaje muere, ya no vuelvan a estar las monedas recogidas...con lo cual, vuelta al principio, creo...

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 07:01 pm
¿En que momento estas guardando ... es decir cuando termine el nivel o le de al boton guardar tiene que ocurrir esto

miSO.data.miArray1grabado = miArray1;
miSO.flush();

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2013 07:06 pm
No entendí tu pregunta.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 07:08 pm
Pretendo que el juego se grabe cada vez que agarra una moneda.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 07:17 pm
Ok, dejalo entonces donde lo tenías, pero grabar un juego cada vez que ocurre algo es altamente ineficiente ...

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2013 07:29 pm
Vale, Jorge, pero dejándolo donde lo tenía ni siquiera desaparecían la monedas...quizá sea más eficaz grabar las monedas cada vez que muriese...¿no?

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 07:41 pm
Agrega esas dos lineas y prueba. Si no funciona, traza el array que se carga al cargar el SO

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2013 07:55 pm
Si te fijas, esas 2 líneas ya las tengo agregadas justo al final del código (dentro del hitTest). Hice el :

trace(miArray1); y me salió:

0,1,1,1,1 con la primera moneda
0,0,1,1,1 con la primera moneda y la segunda agarrada
0,0,0,1,1 con la primera moneda, la segunda y la tercera.
0,0,0,0,1 con la primera, segunda, tercera y cuarta.
0,0,0,0,0 cuando toco la última.

Si cierro el swf y lo vuelvo a abrir, todas las monedas están a cero, hasta que le doy al botón de reiniciar los datos grabados.


0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Mar 2013 08:00 pm
Para dar un poco de vistosidad a esto, aquí está otro archivo anterior que hice, con la misma intención, pero que ocupa cerca de 200 líneas de código:

Por supuesto, si quieren comprobar que se graba tras coger una moneda, no hay más que refrescar la página después de coger alguna moneda...


Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 29 Mar 2013 05:55 pm
Bueno, me puse a trastear y conseguí que funcionara. Ahí el archivo:





y he aquí el código, para quien lo necesite:

Código ActionScript :

var miArray1:Array = [1, 1, 1, 1, 1];
var monedasArray1:Array = [];
var miSO = SharedObject.getLocal("las_monedas");
if (miSO.data.miArray1grabado != null)
{
   miArray1 = miSO.data.miArray1grabado;
}

var xPos = 275;
var yPos = 55;

attachMovie("la_bola","bola",this.getNextHighestDepth(),{_x:121, _y:yPos});
attachMovie("el_reset","reset",this.getNextHighestDepth(),{_x:439, _y:208.2});

var len = miArray1.length;
for (var i = 0; i < len; i++)
{
   var moneda:MovieClip = attachMovie("la_moneda", "coinNVL1_" + i, this.getNextHighestDepth(), {_x:xPos, _y:yPos});
   monedasArray1.push(moneda);
   yPos += moneda._height + 5;
}

onEnterFrame = function ()
{
   var len = monedasArray1.length;
   for (var i = 0; i < len; i++)
   {
      if (monedasArray1[i] != null)
      {
         var moneda:MovieClip = monedasArray1[i];
         //Comprueba si el elemento actual del array es igual a 0 y, si lo es, elimina la moneda asociada al elemento.
         if (miArray1[i] == 0)
         {
            moneda.removeMovieClip();
         }
         if (bola.hitTest(moneda))
         {
            //Hace la animación interior de la moneda, y fija su valor a 0 en el SO.
            miArray1[i] = 0;
            monedasArray1[i] = null;
            moneda.gotoAndStop(2);
            miSO.data.miArray1grabado = miArray1;
            miSO.flush();
         }
      }
   }
   
   if (bola.hitTest(reset))
   {
      trace("has tocado el reset, amigo");
      miSO.clear();
   }


Y ahora, ya terminado el código, como es normal, me asaltan algunas pequeñas dudas, para implementarlo en el juego...

1. En éste código, las monedas las pongo una debajo de otra, declarándolas con una suma de 5 píxeles entre una moneda y otra. Pero y si quiero poner la ubicación exacta de cada moneda en el escenario, ¿cómo lo hago?

2. Como bien dijo Jorge, es ineficaz el grabar cada moneda cada vez que se coge. Bien, lo más inteligente en mi caso sería cambiar la forma de grabar los datos a que se grabe únicamente cuando el personaje muera o pase de fase. ¿Cómo podría cambiar la forma actual de grabar hacia un _currentframe?

Muchas gracias.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 31 Mar 2013 11:25 am
Ok, todo resuelto. Muchas gracias, Jorge, por tu ayuda, sin tu ayuda no hubiese podido entender el problema. A proseguir con el diseño de niveles.

Por chachon2

41 de clabLevel



 

chrome

 

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