Comunidad de diseño web y desarrollo en internet online

La pifié y no sé arreglarlo.

Citar            
MensajeEscrito el 04 Abr 2013 06:11 pm
Hola, sigo con mis archivos de test para incorporarlos en mi juego, y me he tropezado con un escollo.
En el escenario muestro una bola (el personaje), 3 monedas a recoger, unos pinchos (el enemigo) y un contador de puntos.
La idea es que tanto los puntos del contador como que cada una de las monedas recogidas se graben SÓLO cuando el jugador pierde, cuando toca los pinchos en este caso. Y todo eso lo hace correctamente.

El problema viene ahora cuando cojo alguna moneda y cierro el archivo sin perder partida, porque por lo visto graba como que has cogido la moneda,y, al volver a abrir el archivo, desaparecen las monedas cogidas y no concuerdan con los puntos del marcador. Por cierto, todo este error sólo pasa después de haber perdido una vez. Si no pierdes no pasa nada. Espero haberlo explicado bien.
Por si acaso, dejo aquí una muestra, y las instrucciones para ver el fallo.

1. Coge una, dos o las tres monedas y recarga la página. Vuelven a aparecer las tres monedas y el marcador vuelve a cero. Funciona bien.
2. Coge una moneda y toca los pinchos. Ahora de las dos monedas restantes, toca una o las dos. Si recargas la página el contador dice uno pero falta más de una moneda. Ahí está el fallo.

(Ah, la bolita azul es el reinicio de datos. Reinicia tanto las monedas como la puntuación. Pero después hay que recargar la página.)




y aquí está el código:

Código ActionScript :

//Declaramos la variable del SharedObject para crearla si no existe, o para recordarle a flash que ya existe.
var miSO = SharedObject.getLocal("gameover_probando");
//Ponemos en escenario el fondo gris. Puede servir para el game over, para la pausa...
attachMovie("fondo_grey","fondo_gris",200,{_x:275, _y:200});
//Pero lo ponemos invisible.
_root.fondo_gris._visible = false;
//Ponemos un enemigo en el escenario.
attachMovie("pinchos","pinchos1",21,{_x:260, _y:182});
//Ponemos un reseteo de datos en el escenario(bolita azul).
attachMovie("el_reset","reset",23,{_x:120, _y:150});

//Declaramos una función muy importante: la función "escena", la cual borra cualquier cámara que pudiese haber   
//anteriormente, y pone en escenario el personaje y la cámara del juego.
function escena()
{

   camara1.removeMovieClip();
   attachMovie("the_ball","bola",this.getNextHighestDepth(),{_x:120, _y:193});
   
   attachMovie("vcam","camara1",this.getNextHighestDepth(),{_x:299.45, _y:200.50});
   
}
//Esto hace que se active una vez la función "escena".
escena();
//Declaramos otra función muy importante: la función "reset_escena", la cual quita del escenario al personaje, 
//guarda la variable "miArray1" (que es la que dice si la moneda ya está en el escenario o no) y guarda la cantidad de monedas
//recogidas.
function reset_escena()
{
   bola.removeMovieClip();
   miSO.data.miArray1grabado = miArray1;
   miSO.data.mismonedas = coins;
   miSO.flush();
}
//Si no han sido grabadas o el SharedObject ha sido reiniciado, la cantidad de monedas se fija a 0.
coins = miSO.data.mismonedas;
if (miSO.data.mismonedas == undefined)
{
   coins = 0;

}
//Se declaran las variables de Arrays para situar las monedas en el escenario. 
var miArray1:Array = [1, 1, 1];
var monedasArray1:Array = [];
var Arrayposx:Array = [72, 275, 478];
trace(Arrayposx);
var Arrayposy:Array = [290, 338.50, 290];
if (miSO.data.miArray1grabado != null)
{
   miArray1 = miSO.data.miArray1grabado;
}
var len = miArray1.length;
   for (var i = 0; i < len; i++)
   {
      var moneda:MovieClip = attachMovie("la_moneda", "moneda" + i, i +i, {_x:Arrayposx[i], _y:Arrayposy[i]});
      monedasArray1.push(moneda);
   }




onEnterFrame = function ()
{
   //Si pierdes, el fondo cambia de color.
   if (_root.camara1._currentframe == 2)
   {
      _root.fondo_gris._visible = true;
      
   }
   else if (_root.camara1._currentframe == 1)
   {
      _root.fondo_gris._visible = false;
   }
   //Control de la bola.
   if (Key.isDown(Key.RIGHT))
   {
      bola._x += 6;
   }
   if (Key.isDown(Key.LEFT))
   {
      bola._x -= 6;
   }
   if (Key.isDown(Key.UP))
   {
      bola._y -= 6;
   }
   if (Key.isDown(Key.DOWN))
   {
      bola._y += 6;
   }
   if (bola.hitTest(pinchos1))
   {
      bola.gotoAndStop(2);
      _root.camara1.gotoAndStop(2);
   }
   //Hacemos un bucle para borrar la moneda de miArray que sea igual a 0.
   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 (_root.bola.hitTest(moneda))
         {
            //Pone a 0 el elemento de miArray tocado por la bola, hace lo mismo con monedasArray y suma un punto al marcador.
            miArray1[i] = 0;
            monedasArray1[i] = null;
            ++_root.coins;
            removeMovieClip(moneda);
            trace(miArray1[i]);
         }
      }
   }
   if (_root.bola.hitTest(reset))
   {
      trace("has tocado el reset, amigo");
      miSO.clear();
   }
};


Después, añado un "_root.reset_escena" en el frame 2 de la vcam y un "root.escena" en el botón de repetir la partida.

Perdón por el tochazo, pero no sabía cómo explicarlo. Parece que, al grabar la primera vez los datos, las monedas se graban solas al tocarlas con la bola. Si alguien pudiese orientarme...

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 05 Abr 2013 12:50 pm
Según entiendo no concuerdan las monedas y los puntos, pero alguna de las dos cosas está bien, y la relación es directa (es decir sabiendo lasmonedas puedes calcular los puntos y viceversa), ergo no es necesario guardar los puntos sino calcularlos según cuantas monedas faltan o viceversa.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 Abr 2013 03:32 pm
Gracias Jorge. Hasta donde mis nociones de actionscript entienden, lo que hice después de leer tu respuesta fue poner "coins = i + 1" en el bucle for que hay dentro del onEnterFrame. Pero sigue funcionando mal y me estoy desanimando. Ahora, con ese código que incluí, si empiezas la partida, grabas y coges la tercera moneda de izquierda a derecha, el marcador muestra un 1 (se añade un punto por moneda recogida), pero si luego refrescas la página, el marcador muestra un 3, y ya no aumenta más puntos aunque cojas las monedas que quedan.

Otro error que encontré, relacionado con el primero, es que si coges una moneda, pierdes, refrescas el archivo y coges cualquiera de las 2 monedas restantes, el marcador se traba y no funciona correctamente.

Pongo el ejemplo para probar:

editado: pueden ver el juego en

https://0a45ac2e-a-62cb3a1a-s-sites.googlegroups.com/site/flifloflujeras/flifloflu/monedas_gameover2.swf?attachauth=ANoY7cqxKDaYf-qjpVgpu2Y35M3KAnJPboxAQg5PBDG1CgEUfYZkhKS2_DMNsjGYf-qFOro9ilr124MCju-AKs_WvuUVQtnQRYQFuNpKfNsrYvbg1du1FrLt9pAXmpIOB34FrgxIK86kY1AdjVC9ERBysj-c3cKIi32c3A70j9JEwatGMqVcXJlt9ju40BLSmgaAwhNpXCCZjQcV5JiARbHwQh4IzOI_h6MZJ3YeMLSckQEquAaD8UU%3D&attredirects=0

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 08 Abr 2013 10:32 am
En realidad si cada moneda es un punto ... lo unico que tienes que poner en el puntaje es cuantas monedas faltan. Luego tienes todo el juego dentro del onEnterFrame, cuando lo único necesario es el hiTest. En un escenario tan simple ni se nota, en cuanto tengas un escenario complejo la performance decaerá inmediatamente.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Abr 2013 09:43 am
¿Cómo podría hacer un contador que represente el número de monedas cogidas?

¿Cómo hago el contador para calcular la cantidad de elementos eliminados del array, o bien empujados a otro array?

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Abr 2013 09:59 am
SI mal no recuerdo, las monedas quitadas ponian un cero en el array que guardas en el SO, aqui cuento cuantos puntos hay

Código ActionScript :

var total:int = miArray1.length
var puntos = 0
for(var i:int = 0; i<total; i++) if(myArray1[i]==0) puntos++;
trace(puntos)


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Abr 2013 12:22 pm
Pues gracias de nuevo, Jorge, gracias a tu ayuda ya coinciden siempre la cantidad de monedas y las monedas cogidas, jeje. No es un juego muy complicado, y creo que tengo la cantidad de onEnterFrames bastante depurada, así que no creo que haya problema en la velocidad al jugarlo.

Ya sólo queda un pequeño detalle para que el código quede perfecto, y así poder incluirlo en mi juego. Cuando pierdes, se graban automáticamente la cantidad de monedas cogidas y el número del marcador.
Pero si después de perder le das al botón repetir partida, recoges alguna moneda, y cierras y abres de nuevo el archivo, éstas últimas monedas también quedan grabadas, aun sin pasar de nuevo por la pantalla de game over.

Creo que el fallo puede estar en estas líneas:

Código ActionScript :

if (miSO.data.miArray1grabado != null)
{
   miArray1 = miSO.data.miArray1grabado;
}


¿Qué es lo que podría hacer? Ya llevo un mes con este problema, aunque hoy el código está mejor que nunca.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Abr 2013 12:37 pm
El botón repetir partida tiene que inicializar TODOS los recursos, array de monedas nuevos, borrar el SO, inicializar los puntos, etc. El reinit de un juego es uno de los puntos claves

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Abr 2013 01:06 pm
No, hombre, mi botón repetir partida no reinicia todo. Reinicia todo lo que no ha de estar grabado. Ese botón está bien, el fallo está al cerrar el archivo después de perder una vez y haber pillado alguna moneda. Si después abres el archivo, o recargas la página, en este caso, las últimas monedas se han grabado...

Mira el ejemplo:


Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Abr 2013 02:29 pm
Justamente el error es ese, si reinicia, debe reiniciar todo, sino, siempre te quedarán puntitos, moneditas, vidas, etc. De hecho, un error muy popular es terminar el juego y no poder reiniciarlo porque queda X cosas sin borrar

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Abr 2013 02:56 pm
O sea, que en la función "reset_escena" he de reiniciar algo (que aún no se el qué) para que después de usarla, si cojo alguna moneda, no se autograbe la/s moneda/s pilladas, ¿me equivoco?...

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2013 11:45 am
¿Podrían ayudarme a averiguar qué es lo que he de hacer para que la acción de grabado de monedas no persista después de que actúe una vez? Creo que tendré que poner algún tipo de condición en la raíz principal del archivo, pero no logro dar con la clave.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2013 11:51 am
Puede poner un flag (true/false), pero básicamente en el reset, vuelves a rellenar todo el array con 1 y lo guardas. Si no quisieras que grabe nada, puedes poner por ejemplo, finalizado = true; y luego en la parte de grabado chequear

if(!finalizado) graba

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Abr 2013 12:13 pm
Lo que quiero es que únicamente grabe cuando pierde. ¿Funcionará de la forma en que me sugieres?

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2013 12:27 pm
perdio = true

if(perdio) graba

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Abr 2013 12:41 pm
Joder, me siento torpe. Probé lo que me dijiste pero ahora no graba.... :wtf:

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2013 01:17 pm
Dale tiempo, la idea es muy básica

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Abr 2013 07:55 pm
Pues lo dejaré macerar unos días a ver.

Por chachon2

41 de clabLevel



 

opera
Citar            
MensajeEscrito el 15 Abr 2013 06:18 pm
Bueno, había que usar el método slice al final de:

miArray1 = miSO.data.miArray1grabado

y de

miSO.data.miArray1grabado = miArray1.

Solucionado.

Por chachon2

41 de clabLevel



 

chrome

 

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