ActionScript - Juego Plataformas AS3. Collectables, Arrays y Grabado.

 
Vista:

Juego Plataformas AS3. Collectables, Arrays y Grabado.

Publicado por Yas (1 intervención) el 12/09/2017 20:33:06
Buenas, estoy haciendo un prototipo para recoger monedas, desaparezcan y que sólo se grabe si toco con el personaje el MovieClip de grabar. Quiero decir, que si toco ese mc, al cerrar el swf y volverlo a abrir, la moneda no debería volver a aparecer.

Llevo muchos días buscando archivos viejos de As2 para convertirlos a As3, pero ha llegado el momento de pedir ayuda. Necesito si alguien me da una estructura y yo seguirla. Hasta ahora lo que tengo es esto:

En la Clase principal:
1
2
3
4
5
6
7
8
9
10
//ARRAYS
var moneda:Array = new Array();
var miArray1:Array = [1,1,1];
var monedasArray1:Array = [];
var posicionMonedasx:Array = [131.25,232.3,309.25];
var posicionMonedasy:Array = [138.9,138.9,138.9];
 
       //VARIABLES
var tamañoMonedasArray1;
var a;

En la función constructora:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (miSO.data.miArray1Grabado != null)
{
    miArray1 = miSO.data.miArray1Grabado;
}
 
var i = 0;
while (i < miArray1.length)
{
    moneda[i] = new Moneda();
    moneda[i].x = posicionMonedasx[i];
    moneda[i].y = posicionMonedasy[i];
    var monedaPusheada = addChild(moneda[i]);
    monedasArray1.push(monedaPusheada);
    ++i;
}

Y dentro de la función con listener ENTER_FRAME:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
tamañoMonedasArray1 = monedasArray1.length;
a = 0;
while (a < tamañoMonedasArray1)
{
    var monedaDentroArray = monedasArray1[a];
    if (monedasArray1[a] != null)
    {
 
       if (miArray1[a] == 0)
       {
          monedaDentroArray.gotoAndStop(2);
                                //(No me deja hacer un removeChild, no se por qué).
       }
       if (protagonista.hitTestObject(monedaDentroArray))
       {
          miArray1[a] = 0;
          monedasArray1[a] = null;
          monedaDentroArray.gotoAndStop(2);
 
       }
    }
    ++a;
}
 
if (protagonista.hitTestObject(elGrabador))
{
    miSO.data.miArray1Grabado = miArray1;
    miSO.flush();
}


El problema que tengo con este código que he hecho es que después de coger una moneda y tocar elGrabador para grabarla, si cierro el programa y vuelvo a tocar cualquiera de las 2 monedas restantes, cierro sin volver a tocar elGrabador y vuelvo a abrir el swf, esas monedas no grabadas ya no aparecen.

Aquí está el archivo para probarlo:
http://www.fastswf.com/HxiQ-Vw

Espero que no sea un lío, muchas gracias de antemano,
Yas
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Implementación de grabado de monedas

Publicado por Alejandro (369 intervenciones) el 29/06/2023 16:40:00
El problema que estás experimentando se debe a que estás utilizando el mismo índice del array `monedasArray1` para acceder tanto al objeto `Moneda` como a su estado de grabación (`miArray1`). Esto causa que la referencia al objeto `Moneda` se pierda después de haber sido grabada, lo que impide que se muestre correctamente cuando vuelves a abrir el archivo SWF.

Aquí tienes una solución para solucionar este problema y permitir el grabado y carga adecuados de las monedas:

1. Modifica la creación del array `monedasArray1` para que sea un array bidimensional que contenga tanto la instancia de `Moneda` como su estado de grabación. Reemplaza la línea:

1
var monedasArray1:Array = [];

Con:

1
var monedasArray1:Array = [];

2. Dentro del bucle `while` donde creas las monedas, modifica la línea donde agregas `monedaPusheada` al array `monedasArray1`. Reemplaza:

1
2
var monedaPusheada = addChild(moneda[i]);
monedasArray1.push(monedaPusheada);

Con:

1
monedasArray1.push([moneda[i], miArray1[i]]);

Esto asegura que cada elemento agregado a `monedasArray1` sea un array con dos elementos: la instancia de `Moneda` y su estado de grabación.

3. Dentro del bucle `while` donde procesas las monedas en el evento `ENTER_FRAME`, actualiza las líneas donde accedes al objeto `Moneda` y su estado de grabación. Reemplaza:

1
2
var monedaDentroArray = monedasArray1[a];
if (monedasArray1[a] != null)

Con:

1
2
var monedaDentroArray:Array = monedasArray1[a];
if (monedaDentroArray != null)

Esto asegura que `monedaDentroArray` sea el array correcto dentro de `monedasArray1`.

4. Actualiza las líneas donde accedes a la instancia de `Moneda` y su estado de grabación dentro del bucle `while`. Reemplaza:

1
2
3
4
if (miArray1[a] == 0)
{
   monedaDentroArray.gotoAndStop(2);
}

Con:

1
2
3
4
if (monedaDentroArray[1] == 0)
{
   monedaDentroArray[0].gotoAndStop(2);
}

Y reemplaza:

1
if (protagonista.hitTestObject(monedaDentroArray))

Con:

1
if (protagonista.hitTestObject(monedaDentroArray[0]))

Esto asegura que estás accediendo correctamente a la instancia de `Moneda` y su estado de grabación.

Con estos cambios, deberías poder grabar y cargar correctamente el estado de las monedas al cerrar y abrir el archivo SWF. Recuerda que también es importante asegurarte de que el objeto `miSO` esté configurado correctamente para el almacenamiento local.

¡Espero que esto solucione tu problema y te permita avanzar en tu proyecto! ¡Buena suerte con tu juego!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar