Forums » RGSS

Declarando variáveis multiplas

  • Fl\u00e1vio Henrique
    • 683 posts
    4 de junho de 2015 13:30:25 ART

    Citar

    Nome: Declarando variáveis multiplas
    Autoria: Alex Crosslight
    Página do tutorial: http://ateliercross....t/?page_id=1077
    Site do Autor::http://ateliercross.6te.net

     

    Citar

    É aquela situação, você precisa desenhar n variáveis em uma hud no mapa mas não faz idéia de como fazer isso sem ter que declarar muitas manualmente. Isso chega até ser cansativo, especialmente quando você se embaralha nos métodos de desenho e não sabe mais o que ta declarando. Visando isso criei esse tutorial super simples que mostra através de módulos como criar um método que exiba quantas variáveis quiser sem necessitar modificar nada no código principal.


    Conceito inicial, o que são módulos?

    Módulos são literalmente um conjunto de dados pré-configurados que serão aplicados durante a operação do script e que podem, na maioria das vezes, dependendo do scripter, serem alterados. São como formulários onde preenchidos com certos valores irão influenciar de alguma maneira nas opções tomadas pelos blocos de script mais tarde.

    Como iniciar um módulo?

    Um módulo é iniciado com a sintaxe module Name, onde Name será o nome do conjunto de configurações e opções, ele obrigatoriamente deve ser sempre finalizado com um end, antes da execução do bloco seguinte.

    Como inserir as configurações de um módulo?

    De duas formas, aplicando a constante o nome do módulo como prefixo seguido de ::

    moduleConfigNome="nyah"end p Config::Nome


    Ou então incluindo-o dentro de uma classe, desse jeito:

    classScene include Configdef main(...)(...)end


    Por via das duvidas, iremos trabalhar com o segundo jeito, então, crie um novo slot de códigos e declare:

    moduleConfigWindow_Par=[0,0,200,150]Multi_Var={}Multi_Var[0]=[10,20,"Arial",15,1]Multi_Var[1]=[10,20,"Arial",15,"Variável 1: "]end


    O que fizemos aqui foi declarar uma array Window_Par contendo os elementos X,Y, Altura e Largura para nossa janela e uma hash Multi_Var contendo arrays com posição X,Y, Fonte, tamanho da fonte e o que queira escrever na janela, sempre lembrando de obrigatoriamente declarar uma key diferente da outra para cada array pois será necessário daqui a pouco.

    Percebam que o argumento do conteúdo a ser desenhado na constante de key 0 é um numérico e na constante de key 1 é uma string. O numérico identificará que o que você quer desenhar é o valor de uma variável de ID igual a esse numérico, enquanto a string será um texto. Mas como o maker saberá quando eu quero desenhar uma variável ou um texto? Iremos saber isso jaja.

    Agora iremos abrir uma nova Classe herdeira da window_base, no meu caso vou nomea-la como Window_Var:

    classWindow_Var<Window_Base


    Após isso, com o termo include iremos incluir o nosso módulo e usar as constantes do mesmo para operações de nosso código:

    classWindow_Var<Window_Base include Config


    Vamos iniciar o método initialize, com isso no super que irá retornar os parâmetros da nossa window iremos declarar cada Window_Par[X] como argumentos, sendo X a index de cada numérico declarado nessa constante em nosso módulo:

    classWindow_Var<Window_Base include Configdef initialize super(Window_Par[0],Window_Par[1],Window_Par[2],Window_Par[3])


    Depois disso iremos criar o conteúdo de nossa janela, para isso declare:

    classWindow_Var<Window_Base include Configdef initialize super(Window_Par[0],Window_Par[1],Window_Par[2],Window_Par[3])self.contents =Bitmap.new(width -32, height -32)


    Vamos declarar por fim nesse método o refresh que irá reescrever o conteúdo de nossa janela, e na definição desse método iremos criar nossa mágica, lembrando de sempre fechar um método com end.

    classWindow_Var<Window_Base include Configdef initialize super(Window_Par[0],Window_Par[1],Window_Par[2],Window_Par[3])self.contents =Bitmap.new(width -32, height -32) refresh end


    Agora iremos definir o método de refrescar o conteúdo da janela, iremos
    declarar assim:

    def refresh


    Antes de mais nada, iremos aplicar o código self.contents.clear que irá
    apagar todo o conteúdo da janela antes de reescrever um novo antes do
    refresh ser chamado:

    def refresh self.contents.clear


    Para nossa mágica agora, iremos desenhar as variáveis dentro de um bloco
    for i in usando como elementos i as keys da hash Multi_Var:

    def refresh self.contents.clear for i inMulti_Var.keys end


    Dentro desse bloco, iremos definir a fonte e seu tamanho para cada
    texto desenhado, levando em conta que cada texto deverá receber
    a sua pré-definida no nosso módulo, então iremos declarar assim:

    def refresh self.contents.clear for i inMulti_Var.keys self.contents.font.size =Multi_Var[i][3]self.contents.font.name =Multi_Var[i][2]end


    O que foi feito aqui é uma chamada das arrays de key i junto com as indexes
    que se encontravam o tamanho da fonte e o nome para o nosso método.
    Percebeu agora por que era importante definir uma key diferente para cada
    array? Assim sendo, para cada key da hash Multi_Var, chame sua array e
    aplique a cada parâmetro o valor definido.

    Antes de aplicar o método de escrever texto, iremos criar uma condição
    usando o operando condicional ? : que tem a mesma prática do
    if else end, com diferença que pode ocupar menos linhas.Sua sintaxe
    é:

    valor = causa ? consequência : assumir_valor quando não satisfazer a causa


    valor irá assumir a consequência caso causa se satisfazer, do contrário
    assumir_valor quando não santisfazer a causa, então nossa consequência é verificar
    se a array em Multi_Var[4] é um numérico, se for, o valor a ser assumido é uma variável de ID Multi_Var[4], do contrário, irá escrever a constante diretamente,então

    declare:

    def refresh self.contents.clear for i inMulti_Var.keys self.contents.font.size =Multi_Var[i][3]self.contents.font.name =Multi_Var[i][2] cw =Multi_Var[i][4].is_a?(Numeric)? $game_variables[Multi_Var[i][4]].to_s :Multi_Var[i][4]end


    Por fim, é necessário desenhar o texto! Levando em conta os primeiros parâmetros da array

    Multi_Var como sendo a posição X e Y do texto, e a var cw como sendo o texto a ser

    desenhado, então declare:

    def refresh self.contents.clear for i inMulti_Var.keys self.contents.font.size =Multi_Var[i][3]self.contents.font.name =Multi_Var[i][2] cw =Multi_Var[i][4].is_a?(Numeric)? $game_variables[Multi_Var[i][4]].to_s :Multi_Var[i][4]self.contents.draw_text(Multi_Var[i][0],Multi_Var[i][1],100,32,cw)endend


    Lembre-se de fechar o método com um end e a classe com um end, agora iremos partir para

    criar o objeto no mapa, sempre usando aliases para injetar blocos sem precisar

    declarar o método por inteiro a toa.


    classScene_Mapalias config_var_main main def main @var_hud=Window_Var.new config_var_main @var_hud.dispose end


    E por fim, atualiza-la, sempre dando preferência a fazer essa atualização dentro de uma

    condição de tempo para evitar lags em alguns momentos, e por fim, fechar a classe com

    um end.

    alias config_var_update update def update config_var_update ifGraphics.frame_count %4==0@var_hud.update @var_hud.refresh endendend


    Ao final teremos isso:

    moduleConfigMulti_Var={}Window_Par=[0,0,200,150]Multi_Var[1]=[100,20,"Arial",15,1]Multi_Var[2]=[0,20,"Arial",15,"Variável 1: "]Multi_Var[3]=[0,40,"Arial",15,"Variável 2: "]Multi_Var[4]=[100,40,"Arial",15,2]endclassWindow_Var<Window_Base include Configdef initialize super(Window_Par[0],Window_Par[1],Window_Par[2],Window_Par[3])self.contents =Bitmap.new(width -32, height -32) refresh enddef refresh self.contents.clear for i inMulti_Var.keys self.contents.font.size =Multi_Var[i][3]self.contents.font.name =Multi_Var[i][2] cw =Multi_Var[i][4].is_a?(Numeric)? $game_variables[Multi_Var[i][4]].to_s :Multi_Var[i][4]self.contents.draw_text(Multi_Var[i][0],Multi_Var[i][1],100,32,cw)endendendclassScene_Mapalias config_var_main main def main @var_hud=Window_Var.new config_var_main @var_hud.dispose endalias config_var_update update def update config_var_update ifGraphics.frame_count %4==0@var_hud.update @var_hud.refresh endendend


    Com esse código, você poderá declarar quantas variáveis quiser sem necessitar mexer no

    código principal, apenas se lembrando da sintaxe:

    Multi_Var[U]=[V,W,X,Y, Z]


    Onde U é a ID do conteúdo a ser desenhado, V é a posição X, W é a posição Y, X é a fonte, Y

    é o tamanho da fonte e Z é o que quer desenhar, lembrando que se Z for um numérico, ele

    será a ID de uma variável e se for uma string, será um texto.

    Citar


    Considerações finais

    Sem muito a declarar, mas acredito que seja bem util para quem mexa com eventos

    principalmente. Qualquer duvida, dizer nesse tópico ^^


    Kiryo!