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

Como mostrar Window de Status.

Iniciado por SoyeR, 21/11/2018 às 11:54

21/11/2018 às 11:54 Última edição: 02/12/2018 às 09:37 por Corvo
Duvida para projeto pro IGMC. [RPG MAKER MV]

To fazendo uma arvore de upgrades por eventos basica, mas gostaria de colocar pelo menos uma window de status visual pra na hora que o jogador escolher o atributo que deseja aumentar já vê como ficou o resultado.

As informações que seriam mostradas HP, MP, Ataque, Ataque Magico, Defesa.





Lembre-se de informar a engine utilizada, impossível ajudar sem essa informação.



Bom, essa janela é só uma janela de texto com as informações do personagem. Não tem muito segredo. Em que parte está tendo dificuldade?


Bom, não mexo com Js, não saberei explicar para o senhor com detalhes como cada método funciona, mas vejamos:

//-----------------------------------------------------------------------------
// Window_Status
//
// The window for displaying full status on the status screen.

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

Window_Status.prototype = Object.create(Window_Selectable.prototype);
Window_Status.prototype.constructor = Window_Status;

Window_Status.prototype.initialize = function() {
    var width = Graphics.boxWidth;
    var height = Graphics.boxHeight;
    Window_Selectable.prototype.initialize.call(this, 0, 0, width, height);
    this._actor = null;
    this.refresh();
    this.activate();
};

Window_Status.prototype.setActor = function(actor) {
    if (this._actor !== actor) {
        this._actor = actor;
        this.refresh();
    }
};

Window_Status.prototype.refresh = function() {
    this.contents.clear();
    if (this._actor) {
        var lineHeight = this.lineHeight();
        this.drawBlock1(lineHeight * 0);
        this.drawHorzLine(lineHeight * 1);
        this.drawBlock2(lineHeight * 2);
        this.drawHorzLine(lineHeight * 6);
        this.drawBlock3(lineHeight * 7);
        this.drawHorzLine(lineHeight * 13);
        this.drawBlock4(lineHeight * 14);
    }
};

Window_Status.prototype.drawBlock1 = function(y) {
    this.drawActorName(this._actor, 6, y);
    this.drawActorClass(this._actor, 192, y);
    this.drawActorNickname(this._actor, 432, y);
};

Window_Status.prototype.drawBlock2 = function(y) {
    this.drawActorFace(this._actor, 12, y);
    this.drawBasicInfo(204, y);
    this.drawExpInfo(456, y);
};

Window_Status.prototype.drawBlock3 = function(y) {
    this.drawParameters(48, y);
    this.drawEquipments(432, y);
};

Window_Status.prototype.drawBlock4 = function(y) {
    this.drawProfile(6, y);
};

Window_Status.prototype.drawHorzLine = function(y) {
    var lineY = y + this.lineHeight() / 2 - 1;
    this.contents.paintOpacity = 48;
    this.contents.fillRect(0, lineY, this.contentsWidth(), 2, this.lineColor());
    this.contents.paintOpacity = 255;
};

Window_Status.prototype.lineColor = function() {
    return this.normalColor();
};

Window_Status.prototype.drawBasicInfo = function(x, y) {
    var lineHeight = this.lineHeight();
    this.drawActorLevel(this._actor, x, y + lineHeight * 0);
    this.drawActorIcons(this._actor, x, y + lineHeight * 1);
    this.drawActorHp(this._actor, x, y + lineHeight * 2);
    this.drawActorMp(this._actor, x, y + lineHeight * 3);
};

Window_Status.prototype.drawParameters = function(x, y) {
    var lineHeight = this.lineHeight();
    for (var i = 0; i < 6; i++) {
        var paramId = i + 2;
        var y2 = y + lineHeight * i;
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.param(paramId), x, y2, 160);
        this.resetTextColor();
        this.drawText(this._actor.param(paramId), x + 160, y2, 60, 'right');
    }
};

Window_Status.prototype.drawExpInfo = function(x, y) {
    var lineHeight = this.lineHeight();
    var expTotal = TextManager.expTotal.format(TextManager.exp);
    var expNext = TextManager.expNext.format(TextManager.level);
    var value1 = this._actor.currentExp();
    var value2 = this._actor.nextRequiredExp();
    if (this._actor.isMaxLevel()) {
        value1 = '-------';
        value2 = '-------';
    }
    this.changeTextColor(this.systemColor());
    this.drawText(expTotal, x, y + lineHeight * 0, 270);
    this.drawText(expNext, x, y + lineHeight * 2, 270);
    this.resetTextColor();
    this.drawText(value1, x, y + lineHeight * 1, 270, 'right');
    this.drawText(value2, x, y + lineHeight * 3, 270, 'right');
};

Window_Status.prototype.drawEquipments = function(x, y) {
    var equips = this._actor.equips();
    var count = Math.min(equips.length, this.maxEquipmentLines());
    for (var i = 0; i < count; i++) {
        this.drawItemName(equips[i], x, y + this.lineHeight() * i);
    }
};

Window_Status.prototype.drawProfile = function(x, y) {
    this.drawTextEx(this._actor.profile(), x, y);
};

Window_Status.prototype.maxEquipmentLines = function() {
    return 6;
};


Perceba que os primeiros métodos dividem a janela, os últimos vão desenhando item por item. Atributos e equipamentos são desenhados em loops pra economizar código. Porém não consigo te explicar muita coisa.  :rick9:

Tu mesmo já fez uma janela em uma cena uma vez, Soyer. Aqui, e não é a primeira vez que te lembro disso.

A diferença é que naquela situação você estava criando uma cena nova, específica para exibir a janela de conquistas. No seu desafio atual tu quer mostrar a janela na mesma cena que estão os eventos, ou seja, você terá que editar uma Scene que existe, no caso, a Scene_Map. Repare que você quer adicionar uma nova janela a esta Scene e, por coincidência, já existem janelas nesta Scene, como a janela de mensagens, por exemplo. Portanto é só seguir o rastro da criação da janela de mensagens nesta Scene, abrindo o rpg_scenes em um editor de código e procurando por Window_Message, e você irá parar na função createMessageWindow, na própria Scene_Map, que é a função que cria a janela de mensagens nesta cena.

A Window_Message é um caso peculiar por trás várias janelas consigo, como a de escolhas, mas uma alternativa é ver também como a janela de nome do mapa, a Window_MapName, é desenhada nessa cena. Encontrando onde esse processo acontece, é só você seguir o que fez no link do começo dessa minha resposta.

O próximo ponto é criar a janela que será adicionada. A princípio eu te aconselho a tentar mostrar somente uma parte dos atributos, os não alterados pelos upgrades. Naquele link você também criou uma janela, então isto você já tem onde se basear, a dificuldade agora é que imagino que tu não saiba como colher os atributos do personagem. Pense um pouco e lembrará que a janela de status, a Window_Status exibe todos os atributos do personagem, então é só ir nela que lá encontrará o modo de pegar os valores dos atributos do personagem.

Agora quanto à outra janela, a que exibirá os atributos alterados pelo upgrade, veja que ela irá mostrar as mesmas informações, porém de outro personagem. Tecnicamente, é o mesmo personagem, porém com um upgrade novo e aí tu pode fazer a mesma coisa que o RPG Maker faz ao comparar os atributos atuais do personagem com os atributos dele equipado com alguma arma: use dois personagens. O primeiro personagem seria ele próprio, integralmente, já o segundo será uma cópia dele com o upgrade selecionado pelo jogador. Você pode criar uma variável para cada janela que guarde o dono dos atributos que ela está mostrando. Sendo assim, quando o jogador selecionar outro upgrade, você atualiza a janela, trocando o valor dessa variável (afinal após o jogador mudar de upgrade, o personagem terá de ser outro, com o upgrade selecionado atualmente).

Não é difícil de fazer, mas com pouca familiaridade com códigos, talvez seja difícil compreender inicialmente. O tenso é esta ser a última semana do evento e a que eu disponho de menos tempo, senão poderia te guiar como fiz no outro tópico ou mesmo fazer pra tu, dada a urgência. Mas dá uma lida no outro tópico, como tu conseguiu fazer o que queria nele, acho que revê-lo pode refrescar sua mente e deixar este mais fácil de entender.

22/11/2018 às 08:07 #7 Última edição: 22/11/2018 às 08:19 por Corvo
@Corvo quando eu tento usar essa cena aparece Scene is not defined

@Valeu Gerar vou tentar fazer por conta propria com as instruções da cena anterior e do que tu comentou aqui.

Eu realmente queria pronta justamente devido ao prazo, mas vou dar prioridade nas tarefas do projeto e quando tiver mais apresentavel eu posto o projeto no forum  :urra:


Minha outra duvida é que quando eu chamo essa window ela fica ativa no momento e eu só quero mostrar ela pro jogador ver os status enquanto decide o que vai melhorar.

A janela que eu quero que fique ativa é a de escolhas enquanto a status está no canto da tela.

Eu já consegui posicionar a Scene Status do tamanho e no local que eu quero.





Então, janelas que não são filhas da Window_Selectable e da Window_Command não ficam ativas no sentido de o cursor fazer efeito nelas, como esta de atributos que será filha da Window_Base mesmo. O que pode estar acontecendo é tu estar criando a janela de atributos depois da janela de escolhas, assim o programa dá prioridade à que foi criada por último. Tu pode resolver usando alguns códigos após criar todas as janelas:

this._nomeDaWindow.activate();
Define a janela _nomeDaWindow como a ativa, logo ela receberá os comandos do cursor.

this._nomeDaWindow.select(n);
Seleciona a opção de ID n dentre as opções da janela _nomeDaWindow. Lembrando que a primeira opção tem ID == 0.

this._nomeDaWindow.deactivate();
Desativa a recepção de inputs da janela _nomeDaWindow, logo, ela não mais receberá comandos do cursor.

22/11/2018 às 09:06 #9 Última edição: 22/11/2018 às 09:09 por SoyeR
Então eu vi esse de activate quando tava mexendo no script alterei mas as janelas só aparecem uma de cada vez dai se eu ponho desativado fica travado e o player não sai dali

dai to deixando uma por uma por enquanto.