Faalco


Mensagens: 42 Data de inscrição: 03/06/2010 Idade: 20
 | Assunto: Criando uma janela personalizada Qua Jul 07, 2010 8:10 pm | |
| Este tutorial explica como criar janelas personalizadas para o seu jogo usando RGSS. O exemplo utilizado neste tutorial é de uma janela que mostra uma janela personalizada quando você adquirir um item. A primeira coisa que você deve saber sobre como criar uma janela personalizada é que, para olhar como todas as outras janelas no seu jogo, sua classe nova janela deve herdar Window_Base (ou Window_Selectable se o utilizador é suposto escolher algo na janela). Neste caso, eu herdei de Window_Base, uma vez que esta janela é projetada para simplesmente mostrar a informação. O esqueleto da janela deve ficar parecido com o de um código de exemplo. A imagem abaixo mostra o exemplo de código que você começa quando você mostrar essa janela esqueleto. Neste caso, a função Initialize leva dois argumentos, um para o tipo de item a ser exibido (item, arma ou armadura), e outra para a identificação do item nessa categoria. A primeira declaração da função Initialize deve ser sempre um convite para comentar (super 1 em Exemplo de código 1). Os quatro argumentos são, da esquerda para a direita, a coordenada X do pixel superior esquerdo da janela na tela, a coordenada Y do pixel superior esquerdo da janela na tela, a largura da janela em pixels, ea altura da da janela em pixels. A segunda coisa que você deve observar é que quando uma janela é inicializada, a última afirmação deve ser sempre uma chamada para o método de atualização da janela (comentário 2 no conteúdo da janela Exemplo de código 1), assim foram inicializados (neste ponto, a janela é apenas um vazio). Finalmente, para este exemplo, o tipo ea identificação de variáveis de instância são attr_accessors, uma vez que estamos indo ter que ser capaz de defini-los e comparar com eles quando a janela é inserida na classe Scene_Map (3 comentário no código de exemplo 1). :pea: Exemplo de código 1 | Código: | class Window_ItemGet < Window_Base # ------------------------ attr_accessor :type # 3 attr_accessor :id # ------------------------ def initialize(type, id) super(220, 180, 220, 96) # 1 self.contents = Bitmap.new(width - 32, height - 32) self.back_opacity = 255 self.contents.font.name = "Arial" self.contents.font.size = 18 @type = type @id = id refresh # 2 end # ------------------------ def refresh self.contents.clear end # ------------------------ def update super end end |
| Spoiler: | | | 
|
Esqueleto janela criada a partir de código em código de exemplo 1.
O próximo passo é colocar as informações que deseja mostrar em função de atualização da janela. A primeira afirmação em praticamente qualquer método de atualização deve ser para limpar o conteúdo da janela. Como queremos que o texto seja exibido na cor normal, a cor da fonte é o primeiro mudou a cor normal. No caso deste exemplo, eu quero a palavra "adquirida" para apresentar sempre na primeira linha. Para tirar qualquer string dentro de uma janela, você pode usar o método self.contents.draw_text. Os cinco parâmetros, da esquerda para a direita, são as coordenadas X dentro da janela de bitmap para desenhar o texto, a coordenada Y no bitmap janela para desenhar o texto, a largura do espaço alocadas para o texto, a altura do espaço alocado para o texto, eo texto em si. O que aparece abaixo da palavra "adquirida" depende do tipo de variáveis e identificação de instância. As três declarações "if" determinar que tipo de item que estou tratando. Se o tipo é um, eu estou lidando com um item. Se o tipo é de 2, estou lidando com uma arma. Se o tipo é de 3, estou lidando com um item de defesa. Uma vez eu sei que tipo de item que eu estou tratando, eu uso o método # draw_item Window_Base tirar esse ícone do item e nome. O código para tudo isso é mostrado no Exemplo de código 2. A figura abaixo Código Exemplo 2 mostra o que acontece quando eu mostrar a janela com uma arma chamada "Espada de scripting".
Exemplo de código 2
| Código: | def refresh self.contents.clear self.contents.font.color = normal_color self.contents.draw_text(4, 0, 180, 32, "Acquired") if @type == 1 self.draw_item_name($data_items[@id], 4, 32) end if @type == 2 self.draw_item_name($data_weapons[@id], 4, 32) end if @type == 3 self.draw_item_name($data_armors[@id], 4, 32) end end |
| Spoiler: | | | 
|
Janela depois do codigo Refresh
O próximo passo é ligar a janela para a classe Scene_Map para que ele possa ser exibido quando o leitor adquire um novo item. A primeira coisa que precisa ser feito é mudar a função principal de modo que as variáveis apropriadas são inicializados. A função principal para Scene_Map é mostrado no código de exemplo 3, com as alterações do padrão destacadas em vermelho. A primeira coisa a notar é que uma variável de instância nova, acquire_window @, foi adicionado. Esta é uma instância da classe apenas acima definidos (1 comentário no código de exemplo 3). Desde que nós não queremos isso para mostrar até que quiser usá-lo, a visibilidade da nova janela é definida como comentário (false 2 em Exemplo de código 3). O "@ itemdelay variável de instância" será utilizado mais tarde para contar à classe o tempo para mostrar a janela do item (3 comentário no código de exemplo 3). O "@ item_acquired" variável de instância será usada para alimentar o tipo ea identificação do item para a janela (4 comentário no código de exemplo 3). Precisamos ser capazes de modificar essa matriz de fora da classe, por isso é feita uma attr_accessor (cinco comentário no código de exemplo 3). Finalmente, todas as janelas de novo colocado em uma cena deve ter um descarte declaração colocada no final do método Main (6 comentário no código de exemplo 3).
Exemplo de código 3
| Código: | class Scene_Map # --------------------- attr_accessor :item_acquired # 5 # --------------------- def main @spriteset = Spriteset_Map.new @message_window = Window_Message.new @acquire_window = Window_ItemGet.new(1, 0) # 1 @acquire_window.visible = false # 2 @itemdelay = -1 # 3 @item_acquired = [0, 0] # 4 Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze @spriteset.dispose @message_window.dispose @acquire_window.dispose # 6 if $scene.is_a?(Scene_Title) Graphics.transition Graphics.freeze end end |
A fim de gerir efectivamente mostrar a janela, o método de atualização da classe Scene_Map precisa ser mudado. As alterações para a classe são mostrados em vermelho no código de exemplo 4 (todo o método não é mostrado). As mudanças são configuradas de forma que apenas um par de comandos de script são obrigados a fazer a janela aparecer, ea classe Scene_Map cuida de fazê-lo desaparecer depois de alguns segundos. Quando os comandos de eventos como os mostrados na imagem abaixo são usados, ele aciona a declaração em um comentário no código de exemplo 4, atualizar a janela de aquisição item e torná-lo visível. Ele também define a variável de instância @ itemdelay a 125, o que significa que a janela deve ficar visível para 125 frames. A declaração em comentário no código 2 Amostra 4 decrementa @ itemdelay cada frame. A declaração de comentário 3 faz com que a janela invisível e redefine @ itemdelay ao valor de sentinela de -1. O tipo ea identificação do item ao show são repostos a 0, para esperar a próxima vez que a janela de aquisição item precisa ser mostrado.
| Código: | script:$scene.item_accquired[0] = 2 :$scene.item_accquired[1] = 1 Play ME:'010-item01',100'100 Wait 100 Frames |
Fazendo o ponto de Aquisição janela aparecer Exemplo do Codígo 4:
| Código: | def update loop do $game_map.update $game_system.map_interpreter.update $game_player.update $game_system.update $game_screen.update unless $game_temp.player_transferring break end transfer_player if $game_temp.transition_processing break end end @spriteset.update if @itemdelay > 0 @itemdelay -= 1 # 2 end if @itemdelay == 0 # 3 @itemdelay = -1 @acquire_window.visible = false @item_acquired[0] = 0 @item_acquired[1] = 0 end @message_window.update if @item_acquired[0] != 0 && @item_acquired[1] != 0 && @itemdelay < 0 # 1 @acquire_window.type = @item_acquired[0] @acquire_window.id = @item_acquired[1] @acquire_window.refresh @acquire_window.visible = true @itemdelay = 125 end [...] |
Qual cena você precisa modificar vai depender de onde você quiser que a janela apareça e que você está usando para isso. As etapas acima são, no entanto, em geral, aplicável a qualquer janela de informações você pode querer fazer. Windows a partir do qual o usuário deve selecionar um comando são um pouco mais complicado, e será abordado posteriormente.
|
|