Início­Portal­FAQ­Buscar­Membros­Grupos­Registrar-se­Login
Compartilhe | 
 

 Criando uma janela personalizada

Ver o tópico anterior Ver o tópico seguinte Ir em baixo 
AutorMensagem
Faalco
 
 


Mensagens: 42
Data de inscrição: 03/06/2010
Idade: 20

MensagemAssunto: 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.
Voltar ao Topo Ir em baixo
Ver perfil do usuário
 

Criando uma janela personalizada

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo 
Página 1 de 1

Permissão deste fórum:Você não pode responder aos tópicos neste fórum
Cakers RPG Maker - Plums 3.0 :: Aulas de RGSS-