Nesta Lição vamos criar nossa primeira classe.
Abra o RPGMaker Xp e crie um novo projeto. Chame-o como quiser. Abra o Editor de Scripts, e logo acima do Main, insira uma sessão (botão direito -> Inserir). Nomeie-a como quiser. O nome das sessões é irrelevante, pois o RGSS lê o seu conteúdo, não seus nomes.
Na janela do Editor escreva isso:
classWindow_Minha<Window_Base
Note que a palavras class está em minúsculas. TODO e qualquer código escrito no RGSS que se refiram a funções, classes, módulos DEVE ser escrito em minúsculas. Mais tarde veremos que o RGSS é CASE-SENSITIVE (entraremos nos detalhes depois). Note também que estou definindo nossa classe como filha de Window_Base.
Toda classe pré-inicializada possui como procedimento inicial o initialize. Então logo abaixo do class escreva isso:
def initialize
Seu código deve estar assim:
classWindow_Minha<Window_Base def initialize
Agora vamos usar o procedimento de criação da superclasse, usando a palavra reservada super, e junto com ela os parâmetros necessários. PARÂMETROS???
Sim, vamos ver a superclasse para entender isso:
(Veja o anexo)
Note que o initialize da classe Window_Base possui dentro dos parênteses 4 vars, separadas por virgulas. Essas vars são os parâmetros, através dos quais a classe cria a janela, usando seus valores logo abaixo nas declarações self. A palavra self sempre é usada quando falamos do próprio objeto, ou seja, relacionado a ele.
Agora que sabemos pra que servem os parâmetros aqui, vamos voltar para nossa janela.
logo abaixo do initialize escreva assim:
super(32,32,120,64)
Eu peço que escreva e não copie e cole, para que você se habitue a escrever na janela do Editor.
Seu código deve estar assim:
classWindow_Minha<Window_Base def initialize super(32,32,120,64)
Para podermos visualizar nossa janela, devemos agora fechar as declarações. TUDO que for declarado no RGSS, Módulos, Classes, Funções deve ser fechado com a palavra end. Como temos uma classe e um procedimento abertos, vamos fechá-los. Escreva no código assim:
classWindow_Minha<Window_Base def initialize super(32,32,120,64) endend
Agora vamos visualizar nossa janela. Crie um NPC no mapa, e nele use a função "Chamar Script". Agora nela escreva assim:
Window_Minha.new
Rode o game e fale com o NPC. Aí está !! Linda, maravilhosa, e vazia...
Mas não se desespere, isso é só a ponta do Iceberg.
Vamos colocar algo dentro da nossa janela. O que você vê é apenas um desenho do WindowSkin, na largura e altura que você definiu. Para colocar algo dentro da janela, devemos criar dentro dela um bitmap. Um bitmap é sempre usado nesses casos, em qualquer lugar, seja ele uma janela, um Spriteset ou um ViewPort, esses dois últimos serão estudados mais tarde.
Então vamos lá. Para criar o bitmap dentro da janela, usamos a denominação contents, que significa conteúdo. Logo abaixo do super escreva assim:
self.contents =Bitmap.new(width -32, height -32)
Vamos analizar. Usamos o self, dizendo que é este objeto, .contents, que é seu conteúdo, um sinal de igual( = ) para definir, e a declaração Bitmap.new(width - 32, height - 32). Note que estamos passando parâmetros para o bitmap, de largura e altura.
Nosso bitmap está criado. e Agora
Agora, podemos "desenhar" dentro dele, tanto uma imagem, tanto quanto um texto. Vamos começar pelo texto, que é mais simples. A sintaxe é assim:
self.contents.draw_text(x, y, largura, altura, texto [,alinhamento])
O alinhamento é opcional, por isso ele está dentro das chaves.
Logo abaixo da declaração do bitmap, escreva assim:
self.contents.draw_text(4,0,self.width -40,32,"nome",0)
Seu código deve estar assim:
classWindow_Minha<Window_Base def initialize super(32,32,120,64) self.contents =Bitmap.new(width -32, height -32) self.contents.draw_text(4,0,self.width -40,32,"nome",0) endend
Execute o projeto e fale com o NPC.
Estamos indo bem. Já conseguimos fazer uma janela e escrever algo nela. Mas repare que, depois de um tempo, a janela some. Isso se deve porque ela não faz parte dos processos de mapa, você apenas a chamou. Ela não tem nenhum processo que a mantenha aberta. Vamos mudar isso!!
Vamos agora alterar uma classe já existente. Dentro da sessão Main, logo após Graphics.freeze, escreva isso:
$janela =[]
Agora vá no NPC do mapa e mude o código para:
$janela =Window_Minha.new
E rode o game. A janela não some mais !! Mas porque? Porque ela foi DECLARADA. Por isso tudo que for feito no RGSS precisa de declaração.
Vamos mudar o conteúdo da janela agora.
Comente a linha self.contents.draw_text(4, 0, self.width - 40, 32, "nome", 0), para comentar, coloque um # (chama-se sharp) no ínício dela.
Agora na linha self.contents = Bitmap.new(width - 32, height - 32), coloque assim:
self.contents =Bitmap.new("Graphics/Icons/001-Weapon01.png")
Seu código deve ficar assim:
classWindow_Minha<Window_Base def initialize super(32,32,120,64) self.contents =Bitmap.new("Graphics/Icons/001-Weapon01.png") #self.contents.draw_text(4, 0, self.width - 40, 32, "nome", 0) endend
Agora rode o game. É, eu também gosto do ícone da espada. Repare que demos uma caminho de arquivo, no caso do bitmap basta dizer o caminho a partir da pasta do projeto.
Até agora aprendemos que com a classe bitmap(Bitmap.new, declaração de classe, correto?) comporta tanto texto quanto e imagens. Ela também comporta os dois juntos, mas para isso, iremos precisar de outra classe e um módulo. MÓDULO ??
Sim, um módulo é uma pré-definição, como a classe, porém ele não permite instâncias, você não declara @var = modulo.new como é feito com as classes, você chamaMODULO::Classe.procedimento. Os módulos serão estudados com mais ênfaze numa próxima lição, agora só veremos o necessário para o que precisamos.
A classe que vamos precisar é o Rect, que significa retãngulo, a classe Rect cria uma área dentro do bitmap, onde podemos "desenhar" qualquer coisa. Sua definição é:
Rect.new(x, y, largura, altura)
então vamos lá. Retorne a linha bitmap para o que era antes, assim:
self.contents = Bitmap.new(width - 32, height - 32)
Logo abaixo dela escreva assim:
icone = RPG::Cache.icon("001-Weapon01") rect =Rect.new(0,0, icone.width, icone.height)
Acabamos de declarar duas variáveis, uma com a imagem do ícone, onde usamos o módulo RPG::Cache e o procedimento icon, e o nome do arquivo. A extensão do arquivo é desnecessária, o RGSS gera um erro se a imagem não for suportada por ele.
A outra contém nosso rect, que é exatamente do tamanho da imagem carregada na var icone.
Agora usaremos mais uma função do self.contents, a função blt. A função blt vai desenhar dentro do rect a imagem que foi carregada na var icone, sua definição é essa:
blt(x, y, bitmap,rect[,opacidade])
Vamos lá. logo abaixo da declaração do rect, coloque isso:
self.contents.blt(0,0, icone, rect)
Descomente a linha self.contents.draw_text(4, 0, self.width - 40, 32, "nome", 0) e troque o numero 4 por icone.width + 4.
Seu código deve estar assim:
classWindow_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) endend
Agora rode o game. Muito bom !!
CONCLUSÂO:
Começamos a ver hoje como criar uma janela, colocar texto e figuras. Demos uma leve pincelada nos módulos e nas funções internas da classe Window.
Eu quero alertar que a partir de agora tanto as lições quanto os códigos começarão a ficar complexos, por isso, se você realmente tem interesse em aprender, faça perguntas concisas, programar em RGSS é muito fácil, mas depende principalmente de atenção e paciência.
Não jogue fora o projeto com o Exemplo da janela, ele será útil na próxima lição, onde nos aprofundaremos nos procedimentos da classe, gerando novos resultados e alterações na janela.