new Window_Command

2 Respostas   128 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

iJackBoy

  • *
  • Posts: 47
  • Ouros: 8
  • Só sei que nada seihausehasueha
Tópico criado em: 19/07/2017 às 23:07 - Última modificação por iJackBoy em 25/07/2017 às 00:05

Boa noite pessoal, estou começando a utilizar as Classes do RPG Maker MV, porém encontrei algumas dificuldades com a Instancia da Window_Command. Antes de implementar em meu Projeto, sempre faço testes simples de como funcionam, vi em algumas vídeo-aulas como são criadas, mas todos sempre cria um filho da classe e altera, mas eu quero apenas alterar a instancia de uma, acho mais pratico e até mesmo tem esse suporte.

Então, observem:

Código: [Selecionar]
(function(){

scni_map = Scene_Map.prototype.initialize;
Scene_Map.prototype.initialize = function(){
    scni_map.call(this);
};
   
scnc_map = Scene_Map.prototype.create;
Scene_Map.prototype.create = function(){
    scnc_map.call(this);
    this.janela = new Window_Command(100,100);
    this.janela.addCommand("Nome", 'teste');
};
   
scns_map = Scene_Map.prototype.start;
Scene_Map.prototype.start = function(){
    scns_map.call(this);
    this.janela.drawItem(0);
    this.janela.setHandler('teste', true);
    this.addWindow(this.janela);
   
};
   
scnu_map = Scene_Map.prototype.update;
Scene_Map.prototype.update = function(){
    scnu_map.call(this);
   
};
   
})();;

O que acontece; A janela aparece mas não aparecem os item para selecionar.
Se abrir a mesma com a altura até aparece as caixas de seleção porém não aparecem os textos, que a lista de comando contem no Objeto.
Enfim.
Agradeço a quem der uma luz, caso eu encontre eu volto aqui, e esclareço o erro. Bjs
JS > ALLs

Kyo Panda

  • Mito
  • *
  • Posts: 259
  • Ouros: 195
Resposta 1: 20/07/2017 às 11:15

A Window_Command não foi criada para ser utilizada diretamente, devido a sua linha de execução. Você deveria adicionar novos comandos no método makeCommandList, fazendo com que a janela seja redimensionada de acordo com a lista de comandos. Para usa-la diretamente, algo nojento deve ser feito:

Código: [Selecionar]
(function(){
var _Scene_Map_createDisplayObjects =
Scene_Map.prototype.createDisplayObjects
;

Scene_Map.prototype.createDisplayObjects = function() {
_Scene_Map_createDisplayObjects.call(this);

var x = 0;
var y = 0;

this.janela = new Window_Command(x, y);
this.janela.addCommand('Nome', 'teste');
this.janela.setHandler('teste', function() {
alert('Hello, world!');
});

// Redimensiona a janela com os novos itens
this.janela.move(x, y, this.janela.windowWidth(), this.janela.windowHeight());
// Recria o conteúdo para se adequar ao novo tamanho
this.janela.createContents();
// Desenha os itens
this.janela.drawAllItems();

this.addWindow(this.janela);
};
})();

O jeito certo seria:

Código: [Selecionar]
(function() {
'use strict';

function Window_JanelaCommand() {
this.initialize.apply(this, arguments);
}

Window_JanelaCommand.prototype = Object.create(Window_Command.prototype);
Window_JanelaCommand.prototype.constructor = Window_JanelaCommand;

Window_JanelaCommand.prototype.initialize = function(x, y) {
Window_Command.prototype.initialize.apply(this, arguments);
};

Window_JanelaCommand.prototype.makeCommandList = function() {
this.addCommand('Nome', 'teste');
};

var _Scene_Map_createDisplayObjects =
Scene_Map.prototype.createDisplayObjects
;

Scene_Map.prototype.createDisplayObjects = function() {
_Scene_Map_createDisplayObjects.call(this);

this._janela = new Window_JanelaCommand(0, 0);
this._janela.setHandler('teste', function() {
alert('Hello, world!');
});

this.addWindow(this._janela);
};
})();

o/

iJackBoy

  • *
  • Posts: 47
  • Ouros: 8
  • Só sei que nada seihausehasueha
Resposta 2: 20/07/2017 às 13:12 - Última modificação por iJackBoy em 20/07/2017 às 13:36

Então pessoal, acabei de encontrar a solução, na verdade fui descansar um pouco, voltei e pensei mais sobre. Enfim encontrei a solução, vou deixar o código a baixo, caso alguém também esteja estudando já fica minha experiência, se eu tiver mais alguma duvida volto a postar nesse mesmo local.

O detalhe que eu percebi é que não preciso criar uma nova Classe e passar como filho para poder utilizar a mesma janela de que eu precise, apenas eu criei uma instancia.
De qualquer forma essa instancia vem pré-definida, então o que precisei fazer foi adicionar apenas o que eu quis, e nos locais certos.
Meu problema era que não estava criando o conteúdo que avia  adicionado, no caso eu esta faltando colocar no Update, as funções de createContents e drawAllItens que são da Classe, para poder fazer atualizar a janela e incluir os itens. Obrigado, e se servir para alguém, ou alguém tiver duvidas sobre só manda pm.


Código: [Selecionar]
(function(){

scni_map = Scene_Map.prototype.initialize;
Scene_Map.prototype.initialize = function(){
    scni_map.call(this);
    this.janela = new Window_Command(100,100);
};
   
scnc_map = Scene_Map.prototype.create;
Scene_Map.prototype.create = function(){
    scnc_map.call(this);
    this.janela.height = 200;
    this.janela.addCommand("Nome", 'teste');
    this.janela.addCommand("Nome2", 'teste2');
    this.janela.setHandler('teste', true);
};
   
scns_map = Scene_Map.prototype.start;
Scene_Map.prototype.start = function(){
    scns_map.call(this);
    this.addWindow(this.janela);
};
   
scnu_map = Scene_Map.prototype.update;
Scene_Map.prototype.update = function(){
    scnu_map.call(this);
    this.janela.createContents();
    this.janela.drawAllItems();   
};
   
})();


EDIT: Consegui, mas vou ver seu conselho.
Porém ela funcionou e até executou o método.

Eu entendi a forma que você diz, mas eu percebi que para cada classe de Janela eu teria que rodar uma cena, e nesse cado eu estou criando uma unica cena onde varios tipos de janela interagem.


Edit2:
Compreendi melhor, ao inves de criar uma instacia direta de Window_command eu tenho que criar uma jenala filha e depois crislar A instacia dessa janela, entendi! :D. Obrigado ;D
JS > ALLs