1 Lição 9 - Janelas - Um pouco sobre a Window_Selectable 16/2/2012, 21:54
Fetelk13
Membro Honorário I
Olá amigos !! Eu sei que parece estranho voltarmos neste assunto, mas as janelas são o tema mais importante da programação. Sim, é atravéz delas que vemos ou não tudo que é necessário, desde o tempo de jogo até o HP/SP dos heróis.
Algumas coisas nós já sabemos sobre a classe Window, quem ainda não souber procure ler as aulas anteriores. Hoje nós vamos aprofundar neste Item tão importante da programação para jogos.
Primeiramente, devemos lembrar que existem 2 tipos de janelas:
Janelas Estáticas
Janelas Selecionáveis
As Janelas Estáticas são as mais comuns, como as que mostram o dinheiro e o tempo. Janelas Selecionáveis são aquelas que mostram o Cursor, como a janela de seleção do menu, ou a janela de Status, onde se escolhe o herói alvo.
Sabendo com precisão a aplicação de sua janela, você já terá condições de fazer com que ela funcione.
Mas o que as torna tão diferentes, além do cursor?
Levando em conta que, graças ao cursor, a janela precise de dois comandos:
- self.active = true/false - Indica se ela está ativa ou não
- self.index = numero - Indica o ínício do Cursor. Quando este valor é -1(menos um) o cursor não aparece.
E de um procedimento a mais o update_cursor_rect. Neste procedimento, a janela atualiza a posição do cursor, quando este possui um tamanho diferente do padrão.
Alguns de meus Scripts, como o Montar Grupo de heróis:
http://www.jogosrpg.com.br/forum/index.php?
topic=562
Usam uma janela selecionável. Mas como diferenciá-las?
Toda janela estática é filha direta de Window_Base, e toda janela selecionável é filha direta de Window_Selectable. Algum engraçadinho vai dizer que a Window_Selectable é filha de Window_Base. Sim, ela é, pois a Window_Base realmente é a BASE para a construção das janelas. A Window_Selectable possui os métodos de sua classe pai, porém ela foi desenhada para suportar o cursor, movê-lo, gerar um numero de indexação, não mover o cursor quando self.active for igual a false, essas coisas.
Qualquer construtor de menus deveria saber que, antes de mais nada, deve-se conhecer a fundo a classe Window_Selectable, pois sem ela, a construção de menus seria praticamente impossível. Eu digo praticamente pois alguem como eu que já construiu vários menus num sistema sem Scripts, como o Rm2k3, sabe que a dificuldade é enorme. Voltemos ao assunto.
Há algum padrão para se construir menus?
Não. porém há como facilitar a construção. O Próprio RGSS traz uma classe de comandos facilitada, a Window_Command, onde você só passa como parâmetros um array contendo os textos dos itens do menu, e a largura da janela. olhe este código:
De s1 a s6 é criada um array, dentro da declaração, usando [], diz-se que o menu terá 160 de largura, e logo abaixo da declaração diz-se que o index do cursor será o valor da var @menu_index.
Muitos ainda não sabem o que é array, ou como funciona. Seria um bom tema para a próxima aula não? ;D
Observe como foi construída esta janela:
ela é uma janela estática, ou seja, ela não possui cursor(não há a necessidade de um).
Agora observe esta:
Observe que esta janela possui vários itens que a definem como Selecionável:
@item_max = 2 - A quantidade de itens que ela terá
@column_max = 2 - Se esse valor for maior que 1, significa que ela terá também deslocamento horizontal do cursor
self.active = false - Não está ativa
self.visible = false - Não está visível
self.index = 0 - O cursor aparecerá no primeiro item
def update_cursor_rect - Para atualizar a posição do cursor
Observe a matemática desta janela(Eu adoro matemática, você não? ::) ), ela usa de um calculo simples para montar os itens na janela e mover o cursor sobre eles.
O procedimento draw_item recebe dois paramentros, a indexação e a cor. Como a var @commands foi declarada lá em cima no initialize, ele apenas usa do valor de index para saber qual item ele irá desenhar e aonde. o parâmetro color muda se caso a clausula $game_temp.battle_can_escape for false/true.
No caso de nossa segunda janela, o programador não precisou "pensar" ou "calcular" aonde os itens do menu irão aparecer, o código faz isso por ele. Observe esta linha:
rect = Rect.new(160 + index * 160 + 4, 0, 128 - 10, 32)
Ela cria uma região onde será desenhada o item. se você já conhece a função Rect, sabe que ela é assim:
rect = Rect.new(x, y, largura, altura)
A posição X é designada por aquela pequena fórmula:
160 + index * 160 + 4
Se você é bom de matemática, já sabe que em index * 160 se index for 0 (zero) a conta fica assim:
160 + 0 + 4 ou seja 164 é a posição X do primeiro item.
No caso do segundo:
160 + 160 + 4 ou seja 324 é a posição X do segundo item.
Observe que o procedimento update_cursor_rect usa o mesmo cálculo:
self.cursor_rect.set(160 + index * 160, 0, 128, 32)
Significa que sempre que você mover o cursor, ele muda o index, e muda a posição dele.
Por hoje chega. Pesquise suas janelas, observe todas que forem filhas de Window_Selectable, seus funcionamentos. Pretendo extender o assunto, mas já está grande e cansativo. Próxima aula falaremos mais sobre janelas e uma boa explicação sobre Arrays.
Até lá !!
Algumas coisas nós já sabemos sobre a classe Window, quem ainda não souber procure ler as aulas anteriores. Hoje nós vamos aprofundar neste Item tão importante da programação para jogos.
Primeiramente, devemos lembrar que existem 2 tipos de janelas:
Janelas Estáticas
Janelas Selecionáveis
As Janelas Estáticas são as mais comuns, como as que mostram o dinheiro e o tempo. Janelas Selecionáveis são aquelas que mostram o Cursor, como a janela de seleção do menu, ou a janela de Status, onde se escolhe o herói alvo.
Sabendo com precisão a aplicação de sua janela, você já terá condições de fazer com que ela funcione.
Mas o que as torna tão diferentes, além do cursor?
Levando em conta que, graças ao cursor, a janela precise de dois comandos:
- self.active = true/false - Indica se ela está ativa ou não
- self.index = numero - Indica o ínício do Cursor. Quando este valor é -1(menos um) o cursor não aparece.
E de um procedimento a mais o update_cursor_rect. Neste procedimento, a janela atualiza a posição do cursor, quando este possui um tamanho diferente do padrão.
Alguns de meus Scripts, como o Montar Grupo de heróis:
http://www.jogosrpg.com.br/forum/index.php?
topic=562
Usam uma janela selecionável. Mas como diferenciá-las?
Toda janela estática é filha direta de Window_Base, e toda janela selecionável é filha direta de Window_Selectable. Algum engraçadinho vai dizer que a Window_Selectable é filha de Window_Base. Sim, ela é, pois a Window_Base realmente é a BASE para a construção das janelas. A Window_Selectable possui os métodos de sua classe pai, porém ela foi desenhada para suportar o cursor, movê-lo, gerar um numero de indexação, não mover o cursor quando self.active for igual a false, essas coisas.
Qualquer construtor de menus deveria saber que, antes de mais nada, deve-se conhecer a fundo a classe Window_Selectable, pois sem ela, a construção de menus seria praticamente impossível. Eu digo praticamente pois alguem como eu que já construiu vários menus num sistema sem Scripts, como o Rm2k3, sabe que a dificuldade é enorme. Voltemos ao assunto.
Há algum padrão para se construir menus?
Não. porém há como facilitar a construção. O Próprio RGSS traz uma classe de comandos facilitada, a Window_Command, onde você só passa como parâmetros um array contendo os textos dos itens do menu, e a largura da janela. olhe este código:
- Código:
s1 = $data_system.words.item
s2 = $data_system.words.skill
s3 = $data_system.words.equip
s4 = "Status"
s5 = "Salvar"
s6 = "Fim de Jogo"
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
@command_window.index = @menu_index
De s1 a s6 é criada um array, dentro da declaração, usando [], diz-se que o menu terá 160 de largura, e logo abaixo da declaração diz-se que o index do cursor será o valor da var @menu_index.
Muitos ainda não sabem o que é array, ou como funciona. Seria um bom tema para a próxima aula não? ;D
Observe como foi construída esta janela:
- Código:
class Window_Gold < Window_Base
def initialize
super(0, 0, 160, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = $fontface
self.contents.font.size = $fontsize
refresh
end
def refresh
self.contents.clear
cx = contents.text_size($data_system.words.gold).width
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 120-cx-8, 32, $game_party.gold.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(120-cx, 0, cx, 32, "$", 2)
end
end
ela é uma janela estática, ou seja, ela não possui cursor(não há a necessidade de um).
Agora observe esta:
- Código:
class Window_PartyCommand < Window_Selectable
def initialize
super(0, 0, 640, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.back_opacity = 160
self.windowskin = RPG::Cache.windowskin("522_a2")
@commands = ["Lutar", "Fugir"]
@item_max = 2
@column_max = 2
draw_item(0, normal_color)
draw_item(1, $game_temp.battle_can_escape ? normal_color : disabled_color)
self.active = false
self.visible = false
self.index = 0
end
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(160 + index * 160 + 4, 0, 128 - 10, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index], 1)
end
def update_cursor_rect
self.cursor_rect.set(160 + index * 160, 0, 128, 32)
end
end
Observe que esta janela possui vários itens que a definem como Selecionável:
@item_max = 2 - A quantidade de itens que ela terá
@column_max = 2 - Se esse valor for maior que 1, significa que ela terá também deslocamento horizontal do cursor
self.active = false - Não está ativa
self.visible = false - Não está visível
self.index = 0 - O cursor aparecerá no primeiro item
def update_cursor_rect - Para atualizar a posição do cursor
Observe a matemática desta janela(Eu adoro matemática, você não? ::) ), ela usa de um calculo simples para montar os itens na janela e mover o cursor sobre eles.
O procedimento draw_item recebe dois paramentros, a indexação e a cor. Como a var @commands foi declarada lá em cima no initialize, ele apenas usa do valor de index para saber qual item ele irá desenhar e aonde. o parâmetro color muda se caso a clausula $game_temp.battle_can_escape for false/true.
No caso de nossa segunda janela, o programador não precisou "pensar" ou "calcular" aonde os itens do menu irão aparecer, o código faz isso por ele. Observe esta linha:
rect = Rect.new(160 + index * 160 + 4, 0, 128 - 10, 32)
Ela cria uma região onde será desenhada o item. se você já conhece a função Rect, sabe que ela é assim:
rect = Rect.new(x, y, largura, altura)
A posição X é designada por aquela pequena fórmula:
160 + index * 160 + 4
Se você é bom de matemática, já sabe que em index * 160 se index for 0 (zero) a conta fica assim:
160 + 0 + 4 ou seja 164 é a posição X do primeiro item.
No caso do segundo:
160 + 160 + 4 ou seja 324 é a posição X do segundo item.
Observe que o procedimento update_cursor_rect usa o mesmo cálculo:
self.cursor_rect.set(160 + index * 160, 0, 128, 32)
Significa que sempre que você mover o cursor, ele muda o index, e muda a posição dele.
Por hoje chega. Pesquise suas janelas, observe todas que forem filhas de Window_Selectable, seus funcionamentos. Pretendo extender o assunto, mas já está grande e cansativo. Próxima aula falaremos mais sobre janelas e uma boa explicação sobre Arrays.
Até lá !!