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

new Window_Command

Iniciado por iJackBoy, 19/07/2017 às 23:07

19/07/2017 às 23:07 Última edição: 25/07/2017 às 00:05 por iJackBoy
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:

(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

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:

(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:

(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/

20/07/2017 às 13:12 #2 Última edição: 20/07/2017 às 13:36 por iJackBoy
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.


(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