Forums » RGSS

Lição 11 - Programação

    • 683 posts
    2 de junho de 2015 18h15min28s ART
    Programação: Herança, Alias e modelagem de Procedimentos


    OLÁ AMIGOS MAKERS !!


    Fiquei muito tempo afastado do RMXP. Me aprofundei no estudo do Game Maker, enquanto estudava DotNet pra entrar num novo emprego. Entrei no emprego, e agora tudo mudou. Tô tendo que estudar programação 16 horas por dia e tudo que antes era divertido passou a ser "Pra hora que der". Acabei descobrindo algumas coisas interessantes sobre programação que apenas o Ruby possui, e resolvi compartilhar, já que é algo que muitos perguntam.... Vamos lá.

    Nas primeiras aulas eu disse que o RMXP é uma linguagem orientada a objeto que suporta herança.

    O que isso significa??

    Significa que as Classes "Filho" herdam das Classes "Pai" seus métodos, procedimentos, funções e variáveis. Por exemplo:

    Todas as Classes de Janela, em suas declarações, seus nomes vem precedidos de um sinal de <(menor) e o nome da Classe da qual ela está herdando. Veja:

    Código:
    class Window_Selectable < Window_Base


    Veja que a classe Window_Selectable é filha de Window_Base. Isso significa que todos os filhos de Window_Selectable também herdarão a Classe Window_Base. Isso é algo simples de ver na Classe Window_MenuStatus. Ela é Filha de Window_Selectable, porém ela invoca o método draw_actor_name, proveniente da Classe Window_Base.

    Sim, mas e dae??

    A programação orientada a objeto foi feita para que escrevamos menos código, pois, usando a herança, podemos apenas invocar métodos e funções das classes pai sem ter que reescrevê-los. Porém, algumas linguagens como C, C++ e Java(e agora Ruby) permitem que você complemente um método/procedimento/função sem ter que reconstruí-lo(claro que depende da necessidade, se o metódo fará algo completamente diferente do original, você tem que reconstruir) e sem ter que "alcançar" a Classe pai. ou seja, as modificações podem ser Globais(atingir a Classe pai) ou locais(Atingir apenas a Classe atual). Para isso usamos um método muito visto nos scripts MADE-IN-USA, o método Alias.

    O método Alias remomeia método/procedimento/função em tempo de execução, de forma a não mais direcionar as chamadas para o original, e sim para o novo método/procedimento/função que será escrito para complementar o antigo. Vamos ver um exemplo simples?

    Abra um projeto no RMXP, Abra o Editor de Scripts e insira uma nova sessão antes do Main. Dentro dela declare isto:

    Código:
    class Window_Base < Window
      alias draw_actor_name_old draw_actor_name
      def draw_actor_name(actor, x, y)
        self.contents.font.color = disabled_color
        self.contents.draw_text(x + 2, y + 2, 120, 32, actor.name)
        draw_actor_name_old(actor, x, y)
      end
    end


    Observe que eu estou direcionando para a Classe Window_Base. Com isso, esta modificação alcançará todas as classes que forem "filhas" dela(no nosso caso, Todas as classes Window_).

    Rode o projeto e abra o menu. Observe como ficou o efeito de "sombra" no nome dos heróis. Passeie pelo menu e olhe todas as janelas que mostram o nome dos heróis. Em todas, o efeito de "sombra" aparece. 
    Aparece pois modificamos a Classe MOR, de onde todas as outras classes são filhas. Modifique agora o Script que escrevemos para este:

    Código:
    class Window_MenuStatus < Window_Selectable
      alias draw_actor_name_old draw_actor_name
      def draw_actor_name(actor, x, y)
        self.contents.font.color = disabled_color
        self.contents.draw_text(x + 2, y + 2, 120, 32, actor.name)
        draw_actor_name_old(actor, x, y)
      end
    end


    Rode o jogo. Observe que, apenas a tela principal, a MenuStatus, possui o efeito, e todas as outras não.

    Mas e dae, pra quê isso vai me servir??

    Bem, o exemplo mostra tudo, se você desejar fazer uma alteração global, voce pode iniciar novamente a classe, como foi feito no exemplo, remomear o método/procedimento/função usando o método alias como foi usado no exemplo, e modificá-lo a vontade.
    Vale lembrar que o Ruby, assim como outras linguagens OOP, não permite dois  método/procedimento/função com o mesmo nome, então quando usar Alias, lembre-se de dar a ele um nome que não exite ainda no seu projeto, ou você receberá a mensagem Stack level to deep, indicando que o método/procedimento/função está duplicado.

    A sintaxe do método alias é essa:

    alias nome_novo nome_antigo

    Um método pode ser renomeado várias vezes dentro do mesmo projeto, desde que seguidas as normas acima citadas.
    Algumas programações OOP, como o DotNet(minha linguagem de trabalho agora) permite o polimorfismo, ou seja, eu posso ter vários métodos dentro de uma classe com o mesmo nome, diferenciando-os pelos parametros passados ou pelo tipo de parametro. Neste caso, a Engine da linguagem se encarrega de descobrir qual dos metodos será chamado.

    Acho que por hoje é só. Deu pra esclarecer o que é e como funciona o método alias e como podemos tirar proveito do que já existe no RMXP pra criarmos nossos proprios scripts.

    Espero que eu tenha mais tempo para escrever mais aulas, pois o assunto RGSS é realmente muito extenso.

    Até a proxíma.