Forums » RGSS

Lição 4 - Modificando nossa Janela - Usando dados variáveis

    • 683 posts
    2 de junho de 2015 18h04min48s ART

    Antes de iniciar esta aula eu quero pedir desculpas pois eu errei uma coisa na 3º aula, Quando falamos de módulos eu disse que a sintaxe era:

    MODULO::Procedimento

    E na verdade é assim:

    MODULO::Classe.procedimento

    Descobri isso quando lia um dos posts, vi que estava errado. Por falar em posts, meu professor costumava dizer que "Aluno que não pergunta, ou entendeu tudo ou não entendeu nada." Se você está entendendo tudo, ótimo, mas se não entendeu alguma coisa, poste, pergunte, mande PM, porque a partir de agora a coisa vai pegar e, quem estiver entendendo, vai se dar bem, quem não estiver...

    Hoje vamos ver como usar as funções da nossa classe pai. Se você não leu a Lição 3, pare agora e a leia, pois sem ela essa lição é impossível. Caso você tenha perdido o projeto criado na lição 3, retorne a ela crie-o novamente, pois continuaremos nele.

    Vimos na aula anterior como escrever e colocar uma figura numa janela, e como declarar uma janela de forma a ela ser consisa no game. Hoje vamos fazer nossa janela exibir dados variáveis a partir de funções da classe pai Window_Base.DADOS VARIÁVEIS??

    Sim, seu game posui uma enormidade de dados variáveis, como o HP do herói, sua experiência, e outras coisas. Abra o projeto anterior e, abra o editor de scripts. Na sessão onde você criou a nossa janela. Se vc fez tudo corretamente na aula passada, nossa classe deve estar assim:

    Código:
    class Window_Minha < Window_Base
         def initialize
              super(32,32,120,64)
          self.contents = Bitmap.new(width - 32, height - 32)
          icone = RPG::Cache.icon("001-Weapon01")
          rect = Rect.new(0, 0, icone.width, icone.height)
          self.contents.blt(0, 0, icone, rect)
          self.contents.draw_text(icone.width + 4, 0, self.width - 40, 32, "nome", 0)
         end
    end


    Você deve ter percebido que a nossa janela só tem o procedimento initialize. Desta forma, na hora em que a janela é chamada, todo o conteúdo de initialize é lido e desenhado. Vamos colocar mais um procedimento na nossa janela. Logo abaixo do primeiro end escreva assim:

    def refresh

    Logo abaixo dele, vamos pedir que a janela se limpe, usando o método clear, escreva assim:

    self.contents.clear

    Você já sabe o que o self e o contents, estamos fazendo com que o conteúdo da janela seja limpo. Qual a necessidade disso? bem, você vai ver...
    Agora retire esta parte de código do procedimento initialize:

    Código:
          icone = RPG::Cache.icon("001-Weapon01")
          rect = Rect.new(0, 0, icone.width, icone.height)
          self.contents.blt(0, 0, icone, rect)
          self.contents.draw_text(icone.width + 4, 0, self.width - 40, 32, "nome", 0)


    e coloque-o logo abaixo do self.contents.clear. 
    Seu código deve ficar assim:

    Código:
    class Window_Minha < Window_Base
        def initialize
          super(32,32,120,64)
          self.contents = Bitmap.new(width - 32, height - 32)
        end
        def refresh
          self.contents.clear
          icone = RPG::Cache.icon("001-Weapon01")
          rect = Rect.new(0, 0, icone.width, icone.height)
          self.contents.blt(0, 0, icone, rect)
          self.contents.draw_text(icone.width + 4, 0, self.width - 40, 32, "nome", 0)
        end
    end


    Salve o código e rode o game. A janela vai aparecer vazia. Agora vá no NPC e coloque o seguinte código junto com o que já está lá:

    $janela.refresh

    Nosso texto e nosso ícone voltaram a aparecer, porque chamamos o procedimento refresh. Para que não precisemos fazer isso sempre, vamos fazer com que a própria janela chame o procedimento. MAS COMO?? Muito simples, antes do end que fecha o procedimento initialize, escreva refresh.
    Seu código deve estar assim:

    Código:
    class Window_Minha < Window_Base
        def initialize
          super(32,32,120,64)
          self.contents = Bitmap.new(width - 32, height - 32)
          refresh
        end
        def refresh
          self.contents.clear
          icone = RPG::Cache.icon("001-Weapon01")
          rect = Rect.new(0, 0, icone.width, icone.height)
          self.contents.blt(0, 0, icone, rect)
          self.contents.draw_text(icone.width + 4, 0, self.width - 40, 32, "nome", 0)
        end
    end


    Vá no NPC e comente a linha que chama o refresh(vamos usá-la mais tarde) e rode o game. Até agora tudo bem. Vamos agora aprofundar um pouco mais, vamos chamar uma função da classe pai, a função draw_actor_name(actor, x, y). Quero ressaltar que, quando estamos DENTRO da classe, chamamos procedimento, quando estamos FORA da classe, seu procedimento se torna uma função. A função que vamos chamar da classe pai escreve na janela onde foi chamada o nome de um ator(ou herói) designado no parâmetro actor, e x e y é aonde devemos desenhar. Mas como saber qual ator escrever o nome? Vamos ver essa função em ação. Vá na sessão Window_MenuStatus, na linha 34. você vai ver isto:

    Código:
    actor = $game_party.actors


    Mais para a frente aprenderemos o que significa esse i, por enquanto vamos nos atentar ao que precisamos. copie esta linha. Vá na nossa janela, no procedimento refresh e, antes de draw_text, cole a linha. Agora troque o i por 0(zero). Comente a linha draw_text. logo abaixo de actor =... coloque a função draw_actor_name(actor, x, y). Substitua o x poricone.width + 4 e o y por 0(zero). Seu código deve estar assim:

    Código:
    class Window_Minha < Window_Base
        def initialize
          super(32,32,120,64)
          self.contents = Bitmap.new(width - 32, height - 32)
          refresh
        end
        def refresh
          self.contents.clear
          icone = RPG::Cache.icon("001-Weapon01")
          rect = Rect.new(0, 0, icone.width, icone.height)
          self.contents.blt(0, 0, icone, rect)
          actor = $game_party.actors[0]
          draw_actor_name(actor, icone.width + 4, 0)
          #self.contents.draw_text(icone.width + 4, 0, self.width - 40, 32, "nome", 0)
        end
    end


    Agora rode o game. Maravilha !! mas o que fizemos??

    Criamos uma var local, a actor, e definimos para ela um valor, que vem de uma var global, a $game_party. Como $game_party é uma var instanciada da classe Game_Party, eu posso chamar suas funções e variáveis públicas. Neste caso, estamos lendo a var publica actors que é uma var array, onde estão TODOS os heróis do grupo de heróis. o número 0(zero) significa que queremos o primeiro herói, aumente o número(1, 2, no máximo 3, senão haverá um erro) e rode o game. Então é possível concluir que, usando deste artifício, podemos retornar o que quisermos, de quem quisermos(heróis, armas, itens, classes, habilidades, parâmetros, dinheiro do jogo) e mostrar em qualquer lugar, em qualquer janela. Já que estamos embalados em mostrar coisas, vamos fazer um "joguinho". Dentro do def initialize declare uma var pública com o nome de ator e como uma var numérica. Como fazer isso??
    Assim:

    Código:
    @ator = 0


    Agora no def refresh, escreva a seguinte linha:

    Código:
    @ator == 3 ? @ator = 0 : @ator += 1


    Calma, você já vai saber o que é isso. Agora crie um outro NPC, e nele coloque um chamar Script com a seguinte linha:

    Código:
    $janela.refresh


    Na linha actor = $game_party.actors[0], troque o 0(zero) pela var @ator.
    Antes de testar, verifique se seu código está assim:

    Código:
    class Window_Minha < Window_Base
        def initialize
          super(32,32,120,64)
          self.contents = Bitmap.new(width - 32, height - 32)
          @ator = 0
          refresh
        end
        def refresh
          self.contents.clear
          @ator == 3 ? @ator = 0 : @ator += 1
          icone = RPG::Cache.icon("001-Weapon01")
          rect = Rect.new(0, 0, icone.width, icone.height)
          self.contents.blt(0, 0, icone, rect)
          actor = $game_party.actors[@ator]
          draw_actor_name(actor, icone.width + 4, 0)
          #self.contents.draw_text(icone.width + 4, 0, self.width - 40, 32, "nome", 0)
        end
    end


    Agora rode o game. Fale com o primeiro NPC, depois fale repetidas vezes com o segundo. Se você fez tudo correto, o nome escrito na janela deve mudar.
    A linha que criamos ali em cima, a qual você não entendeu patavina, é uma linha condicional. Sim, igualzinho ás condições que você vê dentro da programação de eventos. O seu uso agora foi apenas de demonstração e as condicionais serão explicadas mais tarde.

    CONCLUSÃO:

    Nesta lição apenas vimos como criar novos procedimentos dentro de uma janela, usar funções da classe pai e como funciona(basicamente) o uso de Dados variáveis. Este assunto é muito, muito extenso, e para que você não se sinta desmotivado, eu vou variar um pouco, e depois voltamos ao assunto janelas, pois ainda há muito o que ver.

    A partir desta lição eu começarei a colocar os Tópicos "Dicas e Truques", onde você aprenderá várias coisas legais e úteis no RGSS, enquanto treina seu conhecimento em programação.

    Até.