1 Lição Especial - Scenes - Dúvidas Mais Comuns 12/4/2012, 17:50
Fetelk13
Membro Honorário I
Resolvi abrir um tópico especial sobre Scenes por vários motivos. Graças ao Maker Ewertonsjn e várias PMs recebidas, percebi que muitos tiveram dificuldade de entender o funcionamento de uma Scene. Neste Tópico vou Explicar os problemas e dúvidas mais comuns. Vamos lá.
1º - Eu criei uma janela, como faço para mostrá-la no menu?
No procedimento def main você deve declarar uma variável que será a classe da janela. Procure escrever um nome que você identifique depois, para não ter problemas. Exemplo:
@janela_dinheiro = Window_Gold.new
Veja que eu chamei-a de janela_dinheiro, para facilitar caso eu precise dela depois. mas ATENÇÂO !, todo Scene possui esta estrutura:
A declaração de qualquer objeto deve ser feita ANTES deste código.
2º - Como faço para mostrar uma imagem no fundo do menu?
A mesma regra das janelas se aplica ás imagens. Se você quer mostrar uma imagem estática, declare um Sprite, Assim:
@img_fundo = Sprite.new
@img_fundo.bitmap = RPG::Cache.picture("nomedaimagem")
Se você deseja mostrar uma imagem dinâmica, que se moverá, declare um Plane, assim:
@img_fundo = Plane.new
@img_fundo.bitmap = RPG::Cache.panorama("nomedaimagem")
O RPG::Cache pode ser usado para qualquer pasta de imagens do projeto.
A regra de onde deve ser declarada também é igual a das janelas.
3º - Eu quero que o Mapa com o herói apareça no fundo, é possível?
Sim, porém é uma declaração fixa. O nome da Variável dever ser este, por conveniência da classe Window. Você deve declarar o Spriteset, que é a visualização do mapa. Assim:
@spriteset = Spriteset_Map.new
E agora o mapa aparece, como se o menu fosse transparente. Ah, você deve abrir espaço no menu para que o fundo apareça, ou você vai achar que deu erro. ;D
4º - Eu consegui colocar a janela, mas eu quero mudar o lugar onde ela está posicionada, é possível?
Sim, é possível. Para posicionar a janela basta você configurar, logo abaixo da declaração inicial da janela, os valores X e Y dela, Exemplo:
@janela_dinheiro = Window_Gold.new
@janela_dinheiro.x = 160
@janela_dinheiro.y = 32
Lembre-se, Valores que:
X menor que 0 e maior que 640
Y menor que 0 e maior que 480
- Farão com que a janela suma.
E Valores que:
X mais a largura da janela seja maior que 640
Y mais a altura da janela seja maior que 480- Farão com que a janela apareça cortada.
5º - Legal, Tudo funcionou. Mas agora, quando eu saio do menu, as janelas continuam lá !! ao que fazer ??
Todo e qualquer objeto declarado deve ser destruído. COMO ASSIM??
Quando declaramos um variável, abrimos uma área na memória, que fica ali guardando aquilo que colocamos. Por isso, se você não "destruir"as janelas que criou, elas continuarão alí, até que o sistema precise daquela memória, e veja que ela está sobrando, ae ele vai lá e derruba elas. Como você não quer esperar pelo sistema, é bem simples. Lembra-se do código padrão das Scenes?? este:
Logo depois de Graphics.freeze, você deve escrever assim:
@nome_da_variavel.dispose
Isso vale pra tudo, Janelas, Imagens, Spriteset. Vou demonstrar com as dos exemplos acima:
@janela_dinheiro.dispose
@img_fundo.bitmap.dispose
@img_fundo.dispose
@spriteset.dispose
Repare que eu dei um Dispose na função Bitmap da var @img_fundo. Em alguns casos, é necessário, mas nem sempre.
Fazendo isso, suas janelas desaparecerão ao mudar do menu para o mapa, ou para outro Scene.
6º - PUXA !! Tudo funciona agora. Porém eu fiz uma janela com um texto variável, como o da janela de Help, mas o texto não muda. O que há de errado?
Todo e qualquer objeto que precise ser mudado dentro de uma Scene depende de uma atualização. Se você leu com atenção a aula 8.0, eu falo que o procedimento update é responsável pela atualização de tudo que há na Scene. então, dentro do def update declare o update das variáveis, assim:
@janela_dinheiro.update
@img_fundo.update
@spriteset.update
E pronto. Todas as mudanças necessárias à variável serão executadas.
Acho que por enquanto é só. tem mais dúvidas? algo que eu esqueci? poste aqui ou me mande uma PM. Terei o maior prazer em esclarecer.
Abraço a todos e obrigado mais uma vez.
1º - Eu criei uma janela, como faço para mostrá-la no menu?
No procedimento def main você deve declarar uma variável que será a classe da janela. Procure escrever um nome que você identifique depois, para não ter problemas. Exemplo:
@janela_dinheiro = Window_Gold.new
Veja que eu chamei-a de janela_dinheiro, para facilitar caso eu precise dela depois. mas ATENÇÂO !, todo Scene possui esta estrutura:
- Código:
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
A declaração de qualquer objeto deve ser feita ANTES deste código.
2º - Como faço para mostrar uma imagem no fundo do menu?
A mesma regra das janelas se aplica ás imagens. Se você quer mostrar uma imagem estática, declare um Sprite, Assim:
@img_fundo = Sprite.new
@img_fundo.bitmap = RPG::Cache.picture("nomedaimagem")
Se você deseja mostrar uma imagem dinâmica, que se moverá, declare um Plane, assim:
@img_fundo = Plane.new
@img_fundo.bitmap = RPG::Cache.panorama("nomedaimagem")
O RPG::Cache pode ser usado para qualquer pasta de imagens do projeto.
A regra de onde deve ser declarada também é igual a das janelas.
3º - Eu quero que o Mapa com o herói apareça no fundo, é possível?
Sim, porém é uma declaração fixa. O nome da Variável dever ser este, por conveniência da classe Window. Você deve declarar o Spriteset, que é a visualização do mapa. Assim:
@spriteset = Spriteset_Map.new
E agora o mapa aparece, como se o menu fosse transparente. Ah, você deve abrir espaço no menu para que o fundo apareça, ou você vai achar que deu erro. ;D
4º - Eu consegui colocar a janela, mas eu quero mudar o lugar onde ela está posicionada, é possível?
Sim, é possível. Para posicionar a janela basta você configurar, logo abaixo da declaração inicial da janela, os valores X e Y dela, Exemplo:
@janela_dinheiro = Window_Gold.new
@janela_dinheiro.x = 160
@janela_dinheiro.y = 32
Lembre-se, Valores que:
X menor que 0 e maior que 640
Y menor que 0 e maior que 480
- Farão com que a janela suma.
E Valores que:
X mais a largura da janela seja maior que 640
Y mais a altura da janela seja maior que 480- Farão com que a janela apareça cortada.
5º - Legal, Tudo funcionou. Mas agora, quando eu saio do menu, as janelas continuam lá !! ao que fazer ??
Todo e qualquer objeto declarado deve ser destruído. COMO ASSIM??
Quando declaramos um variável, abrimos uma área na memória, que fica ali guardando aquilo que colocamos. Por isso, se você não "destruir"as janelas que criou, elas continuarão alí, até que o sistema precise daquela memória, e veja que ela está sobrando, ae ele vai lá e derruba elas. Como você não quer esperar pelo sistema, é bem simples. Lembra-se do código padrão das Scenes?? este:
- Código:
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
Logo depois de Graphics.freeze, você deve escrever assim:
@nome_da_variavel.dispose
Isso vale pra tudo, Janelas, Imagens, Spriteset. Vou demonstrar com as dos exemplos acima:
@janela_dinheiro.dispose
@img_fundo.bitmap.dispose
@img_fundo.dispose
@spriteset.dispose
Repare que eu dei um Dispose na função Bitmap da var @img_fundo. Em alguns casos, é necessário, mas nem sempre.
Fazendo isso, suas janelas desaparecerão ao mudar do menu para o mapa, ou para outro Scene.
6º - PUXA !! Tudo funciona agora. Porém eu fiz uma janela com um texto variável, como o da janela de Help, mas o texto não muda. O que há de errado?
Todo e qualquer objeto que precise ser mudado dentro de uma Scene depende de uma atualização. Se você leu com atenção a aula 8.0, eu falo que o procedimento update é responsável pela atualização de tudo que há na Scene. então, dentro do def update declare o update das variáveis, assim:
@janela_dinheiro.update
@img_fundo.update
@spriteset.update
E pronto. Todas as mudanças necessárias à variável serão executadas.
Acho que por enquanto é só. tem mais dúvidas? algo que eu esqueci? poste aqui ou me mande uma PM. Terei o maior prazer em esclarecer.
Abraço a todos e obrigado mais uma vez.