🤔 Para Refletir :
"Medo de usar script calls e plugins? Isso existe?"
- Delayzado

RPG Maker MV Javascript MV - Janelas: O Básico

DanTheLion Masculino

Conde
Administração
Administração
♫ in the jungle, the mighty jungle, the lion sleeps tonight ♫
Juntou-se
10 de Janeiro de 2016
Postagens
464
Soluções
1
Bravecoins
2.415
7iyVJBW.png



Olá a todos, como vão? Eis mais um tutorial de scripting/codificando no RPG Maker MV utilizando o Javascript. Desta vez, vamos aprender a criar janelas. De início, iremos aprender a fazer o básico, para assim prosseguir com outras coisas.



Para começar, crie um arquivo .js para converter o arquivo em linguagem em Javascript. Dentro dele, vamos começar a formar a base principal de uma janela.


No arquivo, crie uma function(); com essa estrutura:

Código:
function Janela() {
  this.initialize.apply(this, arguments);
}

Substitua o nome da função Janela por um nome de janela que você quiser, na prática. Mas por enquanto vamos usar esse nome, lembre-se que este nome será utilizado em todos os códigos que vou citar neste.

Este código é essencial para a criação de uma janela, alias, é essencial para vários tipos de sistema que você utilizar, como Scene.


O código this.initialize.apply(this, arguments); é a ativação da janela pelo protótipo Initialize que ainda não criamos, enquanto não criarmos este protótipo, o código não vai criar a janela.

Antes de criá-la. Vamos colocar alguns códigos antes:

Código:
Janela.prototype = Object.create(Window_Base.prototype);

Esse código dá a ideia ao tipo de janela que queremos criar. Neste caso, vamos usar a Base de uma janela normal, como está definida como Window_Base.prototype.


Código:
Janela.prototype.constructor = Janela;

Este código representa o construtor da janela.


Lembre-se! Na prática, sempre coloque o nome da sua janela com o nome que você definiu na function(); nas primeiras linhas de cada protótipo que você criar.


Agora sim, estamos prontos para criar o protótipo Initialize.

O protótipo Initialize tem essa estrutura:

Código:
Janela.prototype.initialize = function(x, y) {
  var width = 150;
  var height = 150;
  Window_Base.prototype.initialize.call(this, x, y, width, height);
}

Esse protótipo define a forma da sua janela e a posição dela.
Dentro do comando Window_Base.prototype.initialize.call É definido as coordenadas (x e y) a largura e a altura da janela. Mas dentro deste comando, não definiremos as coordenadas, apenas a largura e altura. Como está no código, coloquei 100 pixels para expandir, um quadrado praticamente.


Já terminamos o básico. E para ter certeza que funcionou, vamos colocá-la no mapa.
Vamos adicionar esse código abaixo no nosso script:

Código:
var map_start = Scene_Map.prototype.start;
Scene_Map.prototype.start = function() {
  map_start.call(this);
  this._Janela = new Janela(0, 0);
  this.addWindow(this._Janela);
};

Ela basicamente chama o protótipo padrão Start do Scene_Map para não ocorrer erros e repetições, e em seguida é adicionado a janela por dois comandos:

this._Janela = new Janela(0, 0);

O código citado cria um objeto, que é a nossa janela, e define as coordenadas da posição dela no mapa, neste caso, na ponta superior-esquerdo (x = 0 e y = 0), mas ainda não a colocamos no mapa...

this.addWindow(this._Janela);

... por isso, este comando serve para ativar a janela que criamos dentro do mapa.

O resultado final do script é esse:

Código:
function Janela() {
  this.initialize.apply(this, arguments);
}

Janela.prototype = Object.create(Window_Base.prototype);
Janela.prototype.constructor = Janela;

Janela.prototype.initialize = function(x, y) {
  var width = 100;
  var height = 100;
  Window_Base.prototype.initialize.call(this, x, y, width, height);
}

var map_start = Scene_Map.prototype.start;
Scene_Map.prototype.start = function() {
  map_start.call(this);
  this._Janela = new Janela(0, 0);
  this.addWindow(this._Janela);
}

A imagem provando que deu certo:

IihTNcz.png


Então é aqui que finalizamos o básico de uma janela.



Por hoje é só, folks! Ainda farei mais tutoriais sobre Janelas no RPG Maker MV como adicionar textos, imagens etc. Então fiquem ligados. Veja outros tutoriais de Javascript MV e de Javascript que estão espalhados no fórum da Academia Tecnológica.

~ Abraços!
Até mais! :)
 
E se eu precisar que essa Janela feche automaticamente apos alguns segundos, como fica o script?
 
SoyeR comentou:
E se eu precisar que essa Janela feche automaticamente apos alguns segundos, como fica o script?

Acredito que se você criar um loop na função que adiciona a janela e que, após chegar em determinado valor, remove ela, deve funcionar.

Código:
Scene_Map.prototype.start = function() {
  map_start.call(this);
  var tempoJanela = 0;
  for (tempoJanela = 0; tempoJanela < 20; tempoJanela++) {
  this._Janela = new Janela(0, 0);
  this.addWindow(this._Janela);
}
  this._Janela.hide();
}
 
Virage Detoldev comentou:
SoyeR comentou:
E se eu precisar que essa Janela feche automaticamente apos alguns segundos, como fica o script?

Acredito que se você criar um loop na função que adiciona a janela e que, após chegar em determinado valor, remove ela, deve funcionar.

Código:
Scene_Map.prototype.start = function() {
  map_start.call(this);
  var tempoJanela = 0;
  for (tempoJanela = 0; tempoJanela < 20; tempoJanela++) {
  this._Janela = new Janela(0, 0);
  this.addWindow(this._Janela);
}
  this._Janela.hide();
}

Nope, isso adicionaria 20 janelas à tela, e depois sumiria com a última. Leia seu código em voz alta (ajuda a depurar às vezes, inclusive, e tem até nome: Rubber Duck Debugging), e fica fácil ver que ele faz exatamente isso.

Eu vejo por que você assumiria que esse tipo de código faria algo como "atrasar um evento", e certamente é um chute que eu faria quando ainda não estava acostumado à programação, mas ele demonstra um não-entendimento no que eu imagino ser o princípio central que precisa ser dominado quando você pensa em programação de computadores: seu código faz o que ele é mandado fazer, não mais, não menos.

Assim, se você vê claramente que um código faz X e somente X, então ele não pode fazer Y, a menos que Y seja subtarefa de X. Claramente, esperar um intervalo de tempo e depois executar uma tarefa (como esconder uma janela, por exemplo) não pode ser subtarefa de um laço for.

O código que você procura provavelmente é algo nas linhas de:
Código:
Scene_Map.prototype.start = function() {
  map_start.apply(this, arguments);
  this._Janela = new Janela(0, 0);
  this.addWindow(this._Janela);
  const waitMillis = 1000;
  setTimeout(() => this._Janela.hide(), waitMillis);
}

(vide função setTimeout)

Claro, esse código sozinho é longe da solução ideal (por exemplo: se eu saio da cena de mapa antes dos 1000ms, o que acontece?), mas ainda é mais correto que uma repetição for.

Uma alternativa, geralmente mais usada em scripts para RPG Maker onde, tradicionalmente, não existe suporte amplo a execução paralela (o RGSS não tinha coisas como o setTimeout, por exemplo!), é usar as funções que a própria engine gerante que são executadas X vezes por segundo (e.g. função update das Scenes) junto de uma variável de contador, que podemos incrementar e disparar um evento conforme ela atinja um determinado valor, que sabemos que levará determinado tempo para acontecer.
Isso proporciona maior sincronização com o resto, no sentido de que se algo causar lag, sua tarefa sofre o mesmo atraso que o resto do jogo, e isso pode ser desejável em determinadas situações.

Isso seria implementado mais ou menos assim:
Código:
Scene_Map.prototype.start = function() {
  map_start.apply(this, arguments);
  this._Janela = new Janela(0, 0);
  this.addWindow(this._Janela);
  this.timerToHideWindow = 0;
}

Scene_Map.prototype.update = function() {
  map_update.apply(this, arguments); // map_update definido da mesma forma que map_start, mas para o update
  if (this.timerToHideWindow++ == 60) // 60 = número de frames em um segundo
    this._Janela.hide();
}

Essa abordagem é mais chatinha de ler, e envolve ficar modificando várias funções, mas não tem os problemas que o setTimeout, por exemplo, introduz por conta da execução assíncrona.
 
Brandt comentou:
Eu vejo por que você assumiria que esse tipo de código faria algo como "atrasar um evento", e certamente é um chute que eu faria quando ainda não estava acostumado à programação, mas ele demonstra um não-entendimento no que eu imagino ser o princípio central que precisa ser dominado quando você pensa em programação de computadores: seu código faz o que ele é mandado fazer, não mais, não menos.

Errr... Obrigado, eu acho, pela explicação. xD
Como você mesmo disse, eu realmente deveria ter parado para ler o código e ter percebido. Mas ao menos, eu acredito que mesmo sabendo programar, eu nunca falaria algo como "demonstra um não-entendimento" para quem está aprendendo e ao menos tentou ajudar. Mas, como eu disse, cada um é cada um. :)
 
Ah, claro, peço perdão pela forma de falar.
Minha intenção não era ofender nem nada não, achei que "demonstra um não-entendimento" fosse uma forma razoável de dizer que tinha coisas aí que você devia estudar mais. Não é que isso seja ruim, só precisa, oras.

É legal querer colocar o conhecimento que você está adquirindo no momento em prática, e sei bem que isso ajuda bastante no processo (aprendi a programar por aqui, e respondendo dúvidas assim também), mas é legal ter abertura pra ouvir um toco aqui ou ali de vez em quando.
Eu sempre aprendi mais quando me corrigiam ou sugeriam alterações nos scripts que quando só aceitavam e encorajavam tudo que eu falava/fazia, então fica a dica.

Mas é, vou tentar maneirar na abordagem. Sorry.
Obrigado por movimentar a comunidade e se dispor a ajudar quem precisa, força nos estudos aí \o
 
Muito obrigado [member=468]Daniel M. Neto[/member], esse guia vai me ajudar muito no meu futuro projeto!

Pode contar com seu nome nos "Agradecimentos Especiais" do jogo também! ^.^
 
Voltar
Topo Inferior