Pular para o conteúdo

Salvando e Carregando o Jogo com LocalStorage(Armazenamento Local)


Salvando e Carregando o Jogo com LocalStorage(Armazenamento Local)

Salvar o progresso do jogo é um recurso necessário. Talvez você queira também armazenar a pontuação e o apelido para um jogo acelerado e de sessão curta, tipo o jogo dino do google-chrome. LocalStorage ao resgate! Esse objeto global permite armazenar diferentes tipos de valores string e acessá-los depois. Esse recurso funciona tanto em navegadores modernos como em jogos exportados. Combinado com outros recursos acessíveis, nós podemos armazenar qualquer tipo de dados ou quase todos os tipos de dados!

Salvando Valores Simples

Salvar e lê valores string é muito fácil:

// Escrevendo valores para o localStorage
localStorage.heroName = 'Isaac Newcat';
localStorage.heroTitle = 'The Allmighty';

// Lendo os valores armazenados
if ('heroName' in localStorage) { // alguma coisa foi salva anteriormente?
    // Leia os valores
    this.name = localStorage.heroName;
    this.title = localStorage.heroTitle;
} else {
    // Faz alguma com os dados inexistentes
    requestNameAndTitle();
}

Quando os dados lindos são números, datas, booleanos ou qualquer outra coisa, precisamos converter esses valores antes de usá-los.

// JEITO ERRADO
localStorage.heroLevel = 15;

// …depois…
this.level = localStorage.heroLevel;
// this.level agora é '15'. Espera aí, é uma string!
this.level += 1;
console.log(this.level);

Uso errado do localStorage

this.level agora é '151'! Isso definitivamente não erá o que esperávamos. E a razão é porque o localStorage pode apenas fazer armazenamento em strings. E por causa disso, precisamos converter os valores de localStorage para os tipos que precisamos.

// UM JEITO MELHOR
localStorage.heroLevel = 15;
// …depois…
this.level = Number(localStorage.heroLevel);
// this.level agora é 15. É um número!
this.level += 1;
console.log(this.level);

Uso apropriado do localStorage

Aqui está como podemos converter os objetos do tipo Date e do tipo Boolean:

localStorage.gameStartTime = new Date();
localStorage.hardcoreMode = false;

// depois…

this.startTime = new Date(localStorage.gameStartTime);
this.hardcoreMode = localStorage.hardcoreMode === 'true';

Armazenando Objetos Complexos

Para qualquer coisa além das simples strings e números, precisamos de funções especiais para a codificação e decodificação. Mas como o javascript é maravilhoso, temos uma função assim para isso! Elas sãoJSON.parse(encodedString) e JSON.stringify(complexObject).

var inventory = [{
    name: 'A rusty axe',
    type: 'weapon',
    twoHanded: true
    durability: 0.87,
    damage: [8, 11],
    effects: {
        poison: 1,
        duration: 5
    },
    icon: 'BattleAxe_Old'
    stack: 1
}, {
    name: 'Health Potion',
    type: 'consumable',
    effects: {
        regen: 5,
        duration: 15
    },
    icon: 'Potion_Red',
    stack: 15
}, {
    // …outras coisas
}];

localStorage.heroInventory = JSON.stringify(inventory);

// …depois

this.inventory = JSON.parse(localStorage.heroInventory);

Isso já é o bastante para coisas complexas! Aqui nós codificamos um array, mas você pode passar tanto arrays como objetos com JSON.stringify.

O que não pode ser codificado, as functions, os objetos do tipo Date, referências cíclicas. Mas em muitos casos você não precisará salvar dados assim para o seu jogo!