Lição 4 - Modificando nossa Janela - Usando dados variáveis Hitskin_logo Hitskin.com

Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o temaVoltar para a ficha do tema

Aldeia RPG
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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

2 participantes

Ir para baixo

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

Mensagem por Nothing 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é.

Nothing
Iniciante
Iniciante

Mensagens : 43
Créditos : 8

Ir para o topo Ir para baixo

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 Sáb 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?
MakotoSG
MakotoSG
Novato
Novato

Mensagens : 29
Créditos : 2

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos