Ir al contenido
Descargar

Guardar datos entre rooms

Quieres que las vidas y las monedas del jugador sigan iguales cuando pasa de nivel.

Cuando el juego cambia de room, las instancias de la room anterior desaparecen. Hay dos maneras de mantener una viva.

Un objeto global nace una vez, en la primera room, y existe en todas las demás, sin que coloques una instancia en cada nivel. Es el lugar correcto para un controlador del juego.

  1. Crea un objeto, por ejemplo Controle, con las variables moedas (monedas) y vidas.
  2. En Projeto › Configurações do projeto… (Proyecto › Configuración del proyecto), en Objetos globais (objetos globales), haz clic en + Objeto global y elige Controle.

Desde cualquier otro objeto, encuentra el controlador con instance:

onTouchStart<Player>([this](Player&) {
instance<Controle>()->moedas += 1;
destroy();
});

instance<Controle>() devuelve la primera instancia viva del objeto, o nullptr si no hay ninguna.

Marca Persistente en el Inspector del objeto. La instancia pasa a la siguiente room con todo lo que tenía: variables, temporizadores, posición.

Úsalo cuando la instancia ya está en una room y tiene que ir junto, como el propio jugador.

  • El restart() no vuelve a crear un objeto persistente o global. Si el juego recomienza al terminar la partida, pon tú mismo las vidas y las monedas en cero.
  • La posición también se guarda. Un jugador persistente llega a la room nueva en la misma x e y en que estaba. Reubícalo en el código si hace falta.
  • No guardes un puntero a otra instancia. Puede desaparecer al cambiar de room. Guarda un Handle:
Handle<Enemy> alvo;
if (Enemy* perto = closest<Enemy>()) alvo = perto->handle<Enemy>();
// más tarde:
if (Enemy* enemy = alvo.get()) enemy->destroy();