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...