O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Inserindo novo Game Object (Rpg Maker Mv)

Iniciado por Eliaquim, 26/04/2020 às 16:38

26/04/2020 às 16:38 Última edição: 26/04/2020 às 18:44 por Eliaquim
Olá pessoal!

Eu fiz um plugin (master.js)para adicionar um novo Game Object que possa ser salvo, assim como o Game_System, por exemplo.
E fiz um outro(pupil.js) para usar esse novo game object, criando novas funções ou sobrescrevendo as do master.js
Entretanto, eu fiz a classe na sintaxe do ES6.

Isso está me gerando um problema no qual ao iniciar um novo jogo, eu consigo acessar as funções e os objetos dessa classe.
Porém, ao salvar o jogo, voltar a tela de título e carregar o save, a única coisa que consigo acessar é o objeto. As funções retornam "undefined".

Ao trocar a sintaxe da classe para do ES5(igual a do rm mv), tudo parece funcionar normalmente, mesmo depois de salvar.

Não estou entendendo o porque de um funcionar e outro não =/
Acredito que o Rm Mv já suporta o ES6 não? Ou tenho que atualizar o node.js?(ou nada haver? rs)
Segue um print da situação no console, antes e depois de salvar.

Spoiler
[close]

Segue também os dois plugins para teste.
master.js
pupil.js

Coloca o pupil.js abaixo do master.js

master.js
//==============================================================\\
//                          ES6                                \\
//==============================================================\\
class Game_Eli{
    constructor (){
        this.initialize();
    };
    initialize(){
        this.setObj();
    };
    setObj(){ // To be overwrited by plugin 2
    };
};
//==============================================================\\
//                          ES5                                 \\
//==============================================================\\
// function Game_Eli() {
//     this.initialize.apply(this, arguments);
// }
// Game_Eli.prototype.initialize = function(){
//     this.setObj();
// };
// Game_Eli.prototype.setObj = function(){ // To be overwrited by plugin 2
   
// };
//==============================================================\\
//                      DATA MANAGER                            \\
//==============================================================\\
var $gameEli = null;
var DataManager_createGameObjects = DataManager.createGameObjects;
DataManager.createGameObjects = function() {
    DataManager_createGameObjects.call(this);
    $gameEli = new Game_Eli();
};
var DataManager_makeSaveContents = DataManager.makeSaveContents;
DataManager.makeSaveContents = function() {
    let alias = DataManager_makeSaveContents.call(this);
    alias.eli = $gameEli;
    return alias;
};
var DataManager_extractSaveContents = DataManager.extractSaveContents;
DataManager.extractSaveContents = function(contents) {
    DataManager_extractSaveContents.call(this, contents);
    $gameEli = contents.eli;
};
[close]

pupil.js
Game_Eli.prototype.setObj = function (){
this._book = "Amazing!"
};
Game_Eli.prototype.getObj = function(){
return this._book;
};
[close]

26/04/2020 às 18:12 #1 Última edição: 26/04/2020 às 18:15 por Raizen
CitarAcredito que o Rm Mv já suporta o ES6 não? Ou tenho que atualizar o node.js?(ou nada haver? rs)
Sim, espero ter ajudado.  :XD:

Então brinks, na verdade acho que o seu problema é outro bem diferente. O que acontece é que quando você carrega o jogo ele puxa os dados dos objetos de um Json para carregar as informações do mesmo. Quando você não tem esse objeto salvo inicialmente no Json, ele não vai carrega-lo, provavelmente você iniciou esse objeto em alguma parte que ele consegue ver apenas no novo jogo não? Quando carrega o jogo não foi salvo essas informações, logo é como se não existisse.

No MV ele inicia os objetos dele assim dentro dessa função:


Ele cria um save e extrai dele:


E tem o load dele a partir do Json aqui:


Posso estar enganado claro, mas pelos "sintomas" que você apresentou, acho que é exatamente isso que está ocorrendo, ai bastaria colocar o seu objeto para gravar como json junto com os outros objetos quando o jogo for salvo, e depois carrega-los da mesma forma.

CitarSim, espero ter ajudado.  :XD:
Ja é uma coisa a menos auhahuahuauhahahu


Hm... Então eu teria que criar um arquivo .json para o meu objeto também?
As três primeiras funções eu fiz de acordo:
createGameObjects | makeSaveContents | extractSaveContents

Realmente a única que não usei foi a loadGameWithoutRescue.

Eu nunca revirei a fundo os arquivos .json do mv, que ficam na pasta data.
Mas tipo, como que se salvaria uma função dentro do json? Porque o objeto e o valor ficam salvo: "$gameEli._book". Mas as funções não.
Porque eu não sei se o Game_Timer ou Game_Screen por exemplo tem um json para eles(ou as informações estão espalhadas em outros jsons?)
E tem até o Game_Temp que não fica no save, entretanto as funções dele funcionam normalmente.

E como que isso explicaria também que ao trocar de sintaxe(para a ES5), a minha classe funciona(sem um .json)?
Eu vou colocar o código aqui também e no primeiro post:
master.js
//==============================================================\\
//                          ES6                                \\
//==============================================================\\
class Game_Eli{
    constructor (){
        this.initialize();
    };
    initialize(){
        this.setObj();
    };
    setObj(){ // To be overwrited by plugin 2
    };
};
//==============================================================\\
//                          ES5                                 \\
//==============================================================\\
// function Game_Eli() {
//     this.initialize.apply(this, arguments);
// }
// Game_Eli.prototype.initialize = function(){
//     this.setObj();
// };
// Game_Eli.prototype.setObj = function(){ // To be overwrited by plugin 2
   
// };
//==============================================================\\
//                      DATA MANAGER                            \\
//==============================================================\\
var $gameEli = null;
var DataManager_createGameObjects = DataManager.createGameObjects;
DataManager.createGameObjects = function() {
    DataManager_createGameObjects.call(this);
    $gameEli = new Game_Eli();
};
var DataManager_makeSaveContents = DataManager.makeSaveContents;
DataManager.makeSaveContents = function() {
    let alias = DataManager_makeSaveContents.call(this);
    alias.eli = $gameEli;
    return alias;
};
var DataManager_extractSaveContents = DataManager.extractSaveContents;
DataManager.extractSaveContents = function(contents) {
    DataManager_extractSaveContents.call(this, contents);
    $gameEli = contents.eli;
};
[close]

pupil.js
Game_Eli.prototype.setObj = function (){
this._book = "Amazing!"
};
Game_Eli.prototype.getObj = function(){
return this._book;
};
[close]

26/04/2020 às 19:47 #3 Última edição: 26/04/2020 às 19:49 por Brandt
Citação de: Eliaquim online 26/04/2020 às 18:43
Hm... Então eu teria que criar um arquivo .json para o meu objeto também?

As três primeiras funções eu fiz de acordo:
createGameObjects | makeSaveContents | extractSaveContents

Não. Os arquivos json que ficam salvos na pasta data são arquivos do banco de dados. O RPG Maker usa eles pra persistir as coisas que você configura na engine, tipo personagens, skills, itens, etc. Esses são os objetos do tipo $dataAlgumaCoisa.

Os objetos $gameAlgumaCoisa são objetos efêmeros, que servem pra gerenciar o estado do jogo durante a sua execução. Esses objetos são criados na função createGameObjects e persistidos nos arquivos de save mesmo, então essas são as funções que você precisa alterar, de fato.

Citação de: Eliaquim online 26/04/2020 às 18:43
Mas tipo, como que se salvaria uma função dentro do json?

Você não salva. Compensa rever o conceito de classe e estado: o que você salva no json é o estado do seu objeto; quando você carrega o json, você tem um objeto "puro" (sem classe, sei lá o nome disso), com as mesmas propriedades do objeto que você salvou, mas sem o protótipo. O que você precisa fazer aí é definir o prototype do objeto, pra indicar quais métodos ele tem. Isso é feito usando a função Object.setPrototypeOf.

CitarE como que isso explicaria também que ao trocar de sintaxe(para a ES5), a minha classe funciona(sem um .json)?

Confesso que fico um pouco intrigado com isso também, mas provavelmente tem algo a ver com essa função, que o MV usa pra serializar os objetos em JSON: JsonEx._encode.
Veja que tem uma gambiarra das fortes aí pra salvar o prototype do objeto, e provavelmente ela não trata a forma como as classes do ES6 funcionam (fica o lembrete pra fugir das gambs).
~ Masked

Beleza Brandt!
Vou dar uma olhada nisso de novo do prototype, mas já perdi as contas de quantas vezes li isso uahuahuauhahuahuahua
Eu usei esse site pra converter meu código de ES5 para ES6, e ele deu o mesmo resultado. Então to desconfiando disso do mv mesmo... vou dar uma olhada nessa função e ver se acho alguma luz! auhahuuhauhauha
Se nada der certo, de repente uso a sintaxe do ES5 mesmo, fazer o que =/