Forums » RGSS

[Básico] Aula 8: Criando HUDs e Sprites Parte 1

    • 683 posts
    4 de junho de 2015 13h20min13s ART

    Aula 8: Criando HUDs e Sprites Parte 1

     

    Imagem Postada
    www.mundorpgmaker.com
    This work is licensed under a Creative Commons Atribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Unported License.

     

    Índice de todas as aulas aqui

     

    Índice
    • 8.0 - O que são HUDs e Sprites?
    • 8.1 - Sobrescrevendo métodos
    • 8.2 - Criando Sprites
    • 8.3 - HUD com windows
    • 8.4 - HUD com sprites
    • 8.5 - Conclusão
    • 8.6 - Dever

     

    8.0 - O que são HUDs e Sprites?

     

          HUDs são informações exibidas no mapa constantemente, seja por uma imagem legal, por uma janela, etc. Elas geralmente mostram o HP, MP, e EXP do herói enquanto este anda pelo mapa do jogo.Elas enchem a tela do jogo e são muitos úteis! Um exemplo de HUD é essa que eu fiz:


    Imagem Postada

          E quanto a Sprites? Sprites são objetos especiais, que mostram imagens na tela do jogo. Até agora, o único aparato gráfico que tinhamos era as windows. Nesta aula, aprenderemos a usar imagens que estão na pasta do jogo.Vamos lá?

     

    8.1 - Sobrescrevendo métodos

     

            Antes de fazer nosso Sprite ou Window que fará parte da window, teremos de parar para pensar um pouco...Depois de terminarmos, como colocaremos ela(a HUD) no mapa?Se se lembram bem, para colocarmos um window numa scene(nesse caso Scene_Map), precisamos colocar o código que cria a HUD antes do código fixo.Considerando isso, podemos colocar HUD na scene de três formas básicas:

     

    Modificando diretamente

     

          O que é meio óbvio...É só ir direto no Scene_Map do editor de scripts. Lá temos o método main escrito, criaremos nossa HUD lá. Depois colocaremos a atualização da nossa window no método update. Depois colocaríamos o dispose da HUD depois código fix.Acontece que isso não é viável e não é correto.Já pensou? Na hora de o pessoal usar seu script, você faria uma página enorme de instruções, dizendo que o cara tem de adicionar linhas a tal script...Não é legal.

     

    Redeclarando os métodos

     

          Poderíamos simplesmente criar uma nova aba de scripts, e redeclarar os métodos do mapa:
    classScene_Map   def main   end   def update   endend

          Daí era só digitar os novos métodos da Scene_Map. Porém...também não é legal. Fazendo isso, desconsideramos o método main e update da Scene_Map.Tudo o que eles faziam antes é perdido, e perde lugar para o nosso novo método main e update. Isso quer dizer que o mapa deixará de fazer tudo...Deixará de atualizar os eventos, nem chegará a criar os gráficos...um desastre.Só sobra uma alternativa.

     

    Usando o alias

     

          Usar o alias é muito legal. Muitos  scripter enpacam na hora de usar o alias(confesso que quando eu fazia script na RMB eu nem conseguia usar o alias). Com o alias, podemos modificar métodos como fizemos acima, só que sem perder o que eles faziam antes.Podemos modificar o update do Scene_Map sem perder ele.Usar o alias pode ser bem complicado...Veremos isso logo na frente, com a prática.Porém, para facilitar, irei mostrar a forma geral do alias:


    alias metodo_novo metodo_a_se_mudar def metodo_a_se_mudar   #comandos   metodo_novo   #comandosend

     

    8.2 - Criando sprites

     

          Sprites são objetos que manipulam imagem, basicamente.Se você tem uma imagem e quer exibí-la, usar um Sprite é a solução.Para criar um Sprite de forma bem simples, usamos o código:


    sprite =Sprite.new

          Como podem ver, criar um sprite é MUITO simples. Porém, depois de criar um Sprite, devemos atribuir a ele a imagem que ele exibe.Antes de atribuir a imagem, devemos primeiro carregá-la:


    imagem = RPG::Cache.picture("Nome da imagem")

          Nesse caso, carregamos uma imagem na pasta Pictures, com o nome especificado.Depois de carregar a imagem, devemos atribuir ela ao sprite:


    sprite.bitmap = imagem

          Então, para criar um sprite e atribuir uma imagem a ele, usamos:


    sprite =Sprite.new imagem = RPG::Cache.picture("Nome da imagem") sprite.bitmap = imagem

          Porém, estou falando isso de forma bem superficial. Um Sprite tem muito mais capacidades: é possível mudar a posição do Sprite na tela, fazer animações com ele, e muito mais.Porém, para nossa HUD, é necessário saber só disso.

     

    8.3 - HUD com windows

     

          Antes de colocar uma window como uma HUD, devemos primeiro definí-la.Fiz aqui uma window bem simples, que mostra o nome do primeiro membro do grupo de personagens:


    classWindow_NomeExemplo<Window_Base   def initialize     super(0,0,160,64)     self.contents =Bitmap.new(width -32, height -32)     @actor= $game_party.actors[0]     refresh   end   def update     super     if@actor!= $game_party.actors[0]       @actor= $game_party.actors[0]       refresh     end   end   def refresh     self.contents.clear     draw_actor_name(@actor,0,0)   endend

          A única novidade aqui é o método update da nossa window. Nele, detectamos se foi mudado o primeiro personagem do grupo(por exemplo, trocar do Ash para o Trevor).Se foi mudado, ela re-imprime o nome do primeiro actor.

     

    Colocando a window no mapa

     

          Como eu havia dito, para colocar uma window no mapa a melhor opção é o alias.Usaremos o alias no método main e no método update, pois queremos modificar os dois.O problema dos scripters iniciantes é perceber exatamente o que o alias faz. O alias simplesmente copia o método desejado.Quando não usamos o alias, informações são perdidas, o alias simplesmente copia essas informações.Vamos fazer um pequeno teste do alias, antes de usá-lo.Primeiro, vamos criar um método hipotético(coloque ele acima de todos os scripts, inclusive acima de Main):


    def show_message   p "Olá!"end show_message

          Teste o jogo. Aparecerá a mensagem "Olá!".Agora suponhamos que um outro scripter queira modificar nosso método, adicionando essa linha:


    p "Olá de novo!"

          Se ele não usasse o alias, dessa forma(apague o código de antes e coloque esse):


    def show_message   p "Olá!"enddef show_message   p "Olá de novo!"end show_message

          Ao testar o método(teste agora) ele exibiria somente "Olá de novo!", ou seja, ação p "Olá!" seria perdida.Se ele usasse o alias, o que seria inteligente(remova todo o código e coloque esse e teste):


    def show_message   p "Olá!"endalias old_show_message show_message def show_message   old_show_message   p "Olá de novo!"end show_message

          Teríamos que as duas mensagens são exibidas, "Olá!" e "Olá de novo!".Suponhamos que um outro scripter queira modificar nosso método também, adicionando a linha:


    p "Olá pela terceira vez!"

          Se ele usasse o alias(delete o código de antes, ponha esse e teste):


    def show_message   p "Olá!"endalias old_show_message show_message def show_message   old_show_message   p "Olá de novo!"endalias old_show_message2 show_message def show_message   old_show_message2   p "Olá pela terceira vez!"end show_message

          Observe o que o alias faz.Ele possibilita que adicionemos coisas a certos métodos, mesmo sem saber como eles funcionam.Na primeira vez, copiamos o método main antigo e deixamos ele com o nome de old_show_message. Da segunda vez, copiamos o método main de novo e deixamos a cópia com o nome de old_show_message2. Além disso, observe: usar alias possibilitou que os scripts dos dois carinhas funcionassem juntos. Usar alias é muito necessário na COMPATIBILIDADE DE SCRIPTS.Então, use o alias sempre que puder!Se não entendeu como usar, pelo amor de deus, fale comigo nesta aula que tirarei a dúvida.Então, simples e diretamente, para adicionar nossa window no mapa usamos o alias. Ficará assim nosso código da scene:


    classScene_Map   alias initialize_hud_exemplo main   def main     @window_hud=Window_NomeExemplo.new     initialize_hud_exemplo     @window_hud.dispose   end   alias update_hud_exemplo update   def update     @window_hud.update     update_hud_exemplo   endend

          Se não entendeu esse código, então é porque não entendeu o alias direito...Então, peça ajuda aqui no tópico especificando o que não entendeu.Nosso código final ficará assim:


    classWindow_NomeExemplo<Window_Base   def initialize     super(0,0,160,64)     self.contents =Bitmap.new(width -32, height -32)     @actor= $game_party.actors[0]     refresh   end   def update     super     if@actor!= $game_party.actors[0]       @actor= $game_party.actors[0]       refresh     end   end   def refresh     self.contents.clear     draw_actor_name(@actor,0,0)   endendclassScene_Map   alias initialize_hud_exemplo main   def main     @window_hud=Window_NomeExemplo.new     initialize_hud_exemplo     @window_hud.dispose   end   alias update_hud_exemplo update   def update     @window_hud.update     update_hud_exemplo   endend

    Imagem Postada

     

    8.4 - HUD com sprites

     

          Enganei você! Não ensinarei a fazer HUDs com sprites dessa vez...Fazer HUD com Sprites pode ser muito mais complicado do que parece: é feito exatamente da mesma forma ao encaixar no mapa, porém, ao contrário da HUD com windows, seria necessário explicar como imprimir barras de HP e MP usando Sprites, o que não dá para fazer nessa aula. Esperem pela próxima aula!

     

    8.5 - Conclusão

     

          Espero que tenham gostado da aula.Eu praticamente só falei de como colocar windows no mapa.Na aula que vem, falarei do que realmente interessa: usar a capacidade gráfica que o RGSS nos proporciona.Ensinarei a manipular Sprites, a usar Sprites como HUDs, e muito mais...

     

    8.6 - Dever

     

          Faça uma HUD usando uma window. Nessa HUD, mostre vários atributos interessante do personagem, como HP, MP e EXP. Se quiser, use os seguintes métodos no initialize da window:


    self.opacity =0self.back_opacity =0

          Use-os para deixar o fundo da window invisível, daí aparecerá apenas as informações da HUD.


    [center]:mrm: :mrm: :mrm: