Classe: Marshal
Muitos almejam saber como funciona um sistema de Save. Na verdade, é bem simples...
Existem no Ruby, duas classes de manipulação de arquivo: A file e a Marshal.
Mas então, qual é a diferença?
A file salva os dados literalmente como você ordena, já a Marshal salva os dados de forma encriptada, evitando assim fraudes.
Obviamente, é bem mais seguro usar a Marshal, e é por isto que estou criando esse tutorial.
Existem dois métodos no Marshal:
Marshal.load e
Marshal.dump.
O Marshal.dump salva o valor de uma variável dentro de um arquivo.
Já o Marshal.load agrega a variável tudo o que está contido no arquivo.
Para salvar arquivos: - Código:
-
Marshal.dump(var, arquivo)
arquivo é uma "gambiarra" para a File_Classe a IO Classe. Sendo sua sintax:
- Código:
-
File.open("diretorio+extensão", "IO")
Existem três tipos de IO:
r: Lê apenas. (Não é o nosso caso)
w: Grava apenas.
a: Grava e lê.
O diretório é formado por:
1. A pasta, com barras /
2. O arquivo
3. A extensão do arquivo (.rvdata, .txt)
Se você quiser salvar na própria pasta do jogo, eliminee o diretório.
Vamos a um exemplo prático. Vamos supor que eu quero salvar o HP do herói no arquivo: HP.rvdata, dentro da pasta Data do projeto. Então, eu usaria...
- Código:
-
hp = $game_party.members[0].hp
arquivo = File.new("Data/HP.rvdata", "w")
Marshal.dump(hp, arquivo)
E é isso que acontece no sistema de save. Todas as variáveis $game (lembrando, as variáveis que agregam valor do jogo, tais como: $game_party, $game_player) são salvas em um único arquivo para que possa ser carregadas posteriormente.
Carregando Arquivos:Para isso, usamos o Marshal.load.
Possui uma syntax semelhante ao dump, veja:
- Código:
-
Marshal.load(var, arquivo)
Só que de uma maneira inversa. Ao invés de salvar a variável no arquivo, é o arquivo que se agrega a variável.
Vamos a um exemplo prático.
No Scene_Title, por exemplo, se usa o Marshal.load para agregar todos os arquivos no data dentro das variáveis $data.
Vamos ir mais afundo...
Quando você modifica o valor de um Data_Base, o nome do herói por exemplo, esse valor vai direto por arquivo
Actors.rvdata. E então, quando iniciamos o jogo, a primeira scene a se inicializar é o Scene_Title, e por isso, eles pegam aquele valor que está dentro da Actors.rvdata e o agrega dentro da $data_actors, que logo sevirá de base para a construção da classe $game_actor, $game_actors e $game_party. Deu pra entender até ai?
Com o sistema de save é um pouco diferente. Todas as variáveis $game são salvas num único arquivo.
Na hora de inicializar o jogo, as variáveis $game zeram novamente, e quando pomos pra carregar, abri-se o arquivo que se salvou e se agrega os antigos valores das variáveis $game à elas.
É por isso que eu digo: Um sistema de save nem é tão dificil assim de se entender, basta estudá-lo à fundo.
Bom pessoal... Espero que tenham gostado da aula, embora um pouco confusa, acho que deu pra entender um pouco da lógica, né? :P
Até mais...