Suporte no desenvolvimento de jogos


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

    avatar
    Nothing
    Iniciante
    Iniciante

    Mensagens : 43
    Créditos : 8
    Cash : 0

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

    Mensagem por Nothing em Qua Jan 05, 2011 8:10 am

    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[i]

    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 por icone.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é.
    MakotoSG
    MakotoSG
    Novato
    Novato

    Mensagens : 29
    Créditos : 2
    Cash : 0

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

    Mensagem por MakotoSG em Sab Jul 06, 2013 3:01 am

    Olha, quando eu vou falar com o segundo NPC aparece o seguinte erro:

    Ocorreu um erro NoMethodError, durante operação de script.

    undefined method 'refresh' for nil:NilClass

    E olha que eu já tentei copiar o seu script mas dá o mesmo erro. Já tentei arrumar e nada Sad 
    O que pode ter sido?

      Data/hora atual: Qua Jul 17, 2019 3:58 pm