Tela de Feitos/Conquistas

4 Respostas   292 Visualizações

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

SoyeR

Tópico criado em: 05/01/2018 às 19:52 - Última modificação por Corvo em 06/01/2018 às 11:24

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.




Corvo

Resposta 1: 05/01/2018 às 20:05

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:

Aegis

  • *
  • Posts: 71
  • Ouros: 29
Resposta 2: 05/01/2018 às 20:13

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

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 3: 06/01/2018 às 10:00 - Última modificação por King Gerar em 06/01/2018 às 10:03

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.

Código: [Selecionar]
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).

Código: [Selecionar]
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.

Código: [Selecionar]
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:

Código: [Selecionar]
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:

Código: [Selecionar]
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.

Código: [Selecionar]
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í.

Código: [Selecionar]
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');
};

SoyeR

Resposta 4: 06/01/2018 às 11:16

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: