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

Tela de Feitos/Conquistas

Iniciado por SoyeR, 05/01/2018 às 19:52

05/01/2018 às 19:52 Última edição: 06/01/2018 às 11:24 por Corvo
Fala galera como eu poderia fazer uma Tela de Feitos, nela estaria incluído os dados do que o jogador fez e deixou de fazer da seguinte maneira

Boss Derrotados 3/4
Missões realizadas 7/20
etc
etc

Que seja customizada pra eu poder modificar os dados.





São inúmeras formas, você pode fazer por códigos ou por eventos. Por eventos você só precisa ter conhecimento sobre os comandos de imagens, variáveis e condições. Um modo: primeiro, tu precisaria das imagens referentes às opções, fundo, cursor, numeração, enfim. Tudo o que compor o visual da cena.

         Sempre que o jogador completar uma ação informada na cena, adiciona-se 1 à respectiva variável. Enquanto estiver mostrando as opções da cena, basta verificar o valor da variável e mostrar a imagem do número da mesma. Pode não parecer, mas vai dar mais trabalho do que programar uma Scene nova, tu pode até usar algo desse tipo na criação. :derp:

"There are no heroes, just villains that have something to protect."

06/01/2018 às 10:00 #3 Última edição: 06/01/2018 às 10:03 por King Gerar
Eu aconselho por script. Assim, como o Corvo falou, dá para se fazer por eventos, mas digamos que em um dado como "Missões completas: 013 / 135" você já gastaria quatro imagens no mínimo. Ao vigésimo quinto dado tu chegaria ao limite de imagens que o programa dispõe para uso de eventos. Por código é menos trabalhoso - bem menos trabalhoso - e não tem que ficar preso a esses limites. Seguinte:

Copie o código abaixo para começar o plugin. É um template para criação de uma cena nova. Scene_Nome é o nome da classe que representa essa cena, tu pode trocar pelo que quiser desde que troque em todos os lugares. Neste template só iremos mudar a função create, que é onde colocaremos a criação das coisas que serão mostradas na cena.

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

Scene_Nome.prototype = Object.create(Scene_Base.prototype);
Scene_Nome.prototype.constructor = Scene_Nome;

Scene_Nome.prototype.initialize = function() {
  Scene_Base.prototype.initialize.call(this);
};

Scene_Nome.prototype.create = function() {
  Scene_Base.prototype.create.call(this);
  this.createWindowLayer();
};


Pelo que eu entendi, seria apenas uma cena com uma janela e nesta janela todos os dados contabilizados pelo jogo e o quanto desses dados o jogador alcançou até então. Antes de colocarmos a janela na cena, precisamos criá-la, então segue o template da janela. Cole após o código que já está no plugin (da Scene).

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

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

Window_Nome.prototype.initialize = function() {
  Window_Base.prototype.initialize.call(this, 0, 0, Graphics.boxWidth, Graphics.boxHeight);
  this.refresh();
};

Window_Nome.prototype.refresh = function() {
};


Diferente da classe Scene, na Window não utilizamos a função create para dispor as informações contidas na janela, utilizamos a initialize, que é lida na criação da janela. Perceba que o primeiro comando da função initialize da classe Window_Nome chama o initialize da Window_Base, que é a classe mãe. Caso não tivéssemos colocado uma classe initialize para a Window_Nome, ela herdaria automaticamente a initialize da sua mãe (Window_Base), mas como colocamos, o initialize novo substitui o herdado, então para chamar funções que existem no da classe mãe precisamos chamá-los manualmente. Os valores "0, 0, Graphics.boxWidth e Graphics.boxHeight" referem-se a coordenada X, Y, largura e altura da janela, respectivamente.

Pronto, a janela já está criada. Agora vamos adicioná-la a cena. Para isso, adicione o código abaixo após o código da Scene e antes do código da Window.

Scene_Nome.prototype.createWindow = function() {
	this._nomeWindow = new Window_Nome();
	this.addWindow(this._nomeWindow);
};


Esta é uma nova função que estamos adicionado à Scene_Nome chamada createWindow. Esta função irá, primeiramente, setar uma variável (_nomeWindow) para a janela que desejamos exibir, e em seguida adicionar essa variável à camada de objetos da cena, no caso, à camada seleta de janelas. O this, em qualquer lugar que for usado, informa que estamos nos referindo a uma variável ou função presente na própria classe (no caso, na Scene_Nome).

Agora criamos a função que cria a janela, porém ela ainda não será exibida pois esta função não será lida. Isto porque em nenhum momento chamamos esta função, coisa que faremos agora. Dentro da função initialize da cena/Scene, logo após o comando this.createWindowLayer() (que é o comando que cria a camada de janelas, então é fundamental que ele esteja antes da criação da janela), coloque:

this.createWindow();


Este comando irá chamar a última função que criamos, e ela então será lida. Note que após o nome da função existe um parênteses vazio. Ele serve para, em função que necessitam de argumentos, possamos colocar os argumentos dentro dos parênteses e eles serão então enviados à função quando chamarmos ela, como foi o caso de quando chamamos o initialize da classe mãe da Window_Nome.

Se testar nesse momento o código, verá que a janela aparece mas nenhum texto é exibido, afinal, não fizemos esta parte. Para isso, vamos dentro da função refresh da classe Window_Nome inserir o seguinte código:

this.drawText("Espadas encontradas: " + $gameVariables.value(10) + " / 25", 0, 0, this.contentsWidth(), 'left');


Este comando chama a função que escreve um texto na janela. Note que utilizamos os parênteses para enviar argumentos, e muitos. Cada argumento é separado por vírgula, portanto, enviamos cinco argumentos. São eles:

"Espadas encontradas: " + $gameVariables.value(10) + " / 25" - o texto, que deve ser uma string.
0 - a coordenada X do texto dentro da janela, que deve ser um número.
0 - a coordenada Y do texto dentro da janela, que também deve ser um número.
this.contentsWidth() - a largura que o texto poderá ocupar dentro da janela. Aqui colocamos chamamos uma outra função que irá retornar o valor da largura da janela, ou seja, o texto poderá ocupar todo o espaço da largura da janela.
'left' - o alinhamento do texto, que também deve ser uma string.

Ah, $gameVariables é a variável que armazena todas variáveis que utilizamos através dos comandos por eventos. value(10) é porque iremos requerer o valor da variável de ID 10.

Agora a cena já exibe a janela com o dado que incluímos nela. Para incluir mais dados, basta copiar e colar abaixo o código que escreve o texto, lembrando de alterar a coordenada Y de cada comando novo.

O problema agora é que podemos entrar na cena, mas não temos meios de sair dela. Para isso vamos adicionar a função de update nela. Esta função é lida constantemente, verificando possíveis atualizações a serem feitas na classe. Como até então não havíamos escrito uma nova, ela era herdada da classe mãe com o que fosse necessário, agora que iremos escrevê-la, devemos tomar o cuidado de chamar o update da classe mãe para continuarmos tendo o que era preciso da classe mãe, tal como fizemos no initialize.

Scene_Nome.prototype.update = function() {
	Scene_Base.prototype.update.call(this);
	if (Input.isTriggered('cancel')) {
		this.popScene();
	};
};


O bloco que se inicia no if é uma condição. Ela verifica se o botão 'cancel' foi pressionado. Como o update é lido constantemente, essa verificação é feita constantemente. No momento em que for constatada ser verdadeira, ela irá chamar a função popScene, que sai da cena atual e volta para a anterior.



E isso aí é o plugin. Salva em .js, coloca na pasta de plugins, ativa-o através do gerenciador e vê se vai funcionar como esperava.  :ok:
Caso deseje, abaixo está este plugin. Mas recomendo e espero muito que tente fazer seguindo as instruções, pode vir a te passar um pouco sobre como funcionam e quem sabe aprender mais coisas a partir daí.

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

Scene_Nome.prototype = Object.create(Scene_Base.prototype);
Scene_Nome.prototype.constructor = Scene_Nome;

Scene_Nome.prototype.initialize = function() {
  Scene_Base.prototype.initialize.call(this);
};

Scene_Nome.prototype.create = function() {
  Scene_Base.prototype.create.call(this);
  this.createWindowLayer();
	this.createWindow();
};

Scene_Nome.prototype.createWindow = function() {
	this._nomeWindow = new Window_Nome();
	this.addWindow(this._nomeWindow);
};

Scene_Nome.prototype.update = function() {
	Scene_Base.prototype.update.call(this);
	if (Input.isTriggered('cancel')) {
		this.popScene();
	};
};

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

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

Window_Nome.prototype.initialize = function() {
  Window_Base.prototype.initialize.call(this, 0, 0, Graphics.boxWidth, Graphics.boxHeight);
  this.refresh();
};

Window_Nome.prototype.refresh = function() {
	this.drawText("Espadas encontradas: " + $gameVariables.value(10) + " / 25", 0, 0, this.contentsWidth(), 'left');
};

Valeu gê to fazendo que nem você falou, ainda vou preencher com mais dados e deixar mais organizado e atraente, mas por enquanto ta assim: