1 Lição 11 - Programação: Herança, Alias e modelagem de Procedimentos 12/4/2012, 17:47
Fetelk13
Membro Honorário I
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:
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:
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:
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.
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.