[Script] Class.lua - handler de classes |
Jp_darkuss « Citoyen » 1630624380000
| 1 | ||
Eae galera, firmeza? Então... Faz tempo que não jogo Transformice (infelizmente não pretendo voltar a jogar por causa de alguns probleminhas...), mas nesse meio tempo que adquiri tempo livre para fazer algo diferente, decidi trazer algo novo para a comunidade br. Na verdade, é algo que já tinha pensado há muito tempo desde que aprendi a mexer com classes em Lua, só nunca tentei tirá-lo do papel. Nos finalmentes, estou trazendo uma classe que auxilia a criação de classes em Lua, o Class.lua! Mas qual a diferença que há entre a classe e o sistema de classes nativo da linguagem? É isso que vocês verão nos próximos tópicos! Entretanto de antemão já pus aqui em baixo o link para vocês adquirirem o código: Class.lua (acesse o script aqui!) Observações O objetivo para a criação desse script é adicionar novas funcionalidades na hora de criar uma classe, tornando o programa mais elegível a problemas mais complexos que exijem ferramentas diferentes. O script não foi criado com o objetivo de simplificar a criação de classes (apesar de que é possível usar menos linhas com ele), portanto este não é recomendado se você necessita criar objetos simples ou se você é iniciante na área da programação. A classe inserida nesse tópico pode ser usado em qualquer plataforma que use Lua e aceite metamétodos. Deus seja louvado! Pra quem caiu de paraquedas nessa linguagem, apresentarei as formas mais conhecidas de se criar uma classe na linguagem Lua: View Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 local Entity= {} View Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 local Entity= function(x, y) Entretanto, em nenhumas dessas formas existem variáveis ou métodos privadas já fornecidos pela Linguagem Lua, você mesmo teria que criá-las. De fato, se estivermos trabalhando com a Factory, privacidade não é um grande problema, mas e se for uma metatabela? E se você quiser uma função do tipo "get" (pesquise isso em Javascript para mais informações). Por causa desses problemas decidi criar essa classe para facilitar tudo. Antes de passarmos para o tutorial, eis aqui o exemplo dessa mesma classe Entity usando o Class.lua: Class.lua Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 local Entity= Class.new("x,y") Para aplicar o construtor de classes em seu script é muito simples. Inicialmente, obviamente, certifique-se de que incluiu o código-fonte no seu script ;) Vamos criar um exemplo simples, uma classe para guardar informações sobre players e agir sobre eles! Primeiramente teremos que construir nossa classe; para isso, usaremos a funcão Class.new, que nos ajudará a construí-la: Code Lua 1 2 3 4 5 6 7 8 local _, err= pcall(nil) O método Class.new pode receber somente um argumento (vars), uma string onde você indicará quais variáveis você quer criar dentro de sua classe. A formatação é simples, basta por na string o nome da variável, e caso queira por mais, é só separar por vírgulas (não ponha espaços!). Por exemplo, se quiséssemos só o nome, a formatação seria: "name"; e se fosse nome - posição x - posição y, poderíamos impôr: "name,x,y". Nesse exemplo só usaremos o nome: Code Lua 1 2 3 4 5 6 7 8 local _, err= pcall(nil) Você já poderia utilizar a classe, mas ela seria só um pequeno objeto com uma propriedade simples (Table {name= String}). Vamos adicionar um método? Que tal um para mover o player? Para isso usaremos o método :method, que recebe como primeiro parâmetro o nome do método, e em seguida uma callback; vale lembrar que a callback recebe os parâmetros self (para acessar os dados do objeto) e a variável args para acessar dados passados para a função (self, ...): Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 local _, err= pcall(nil) Agora que temos nossa classe pronta, vamos criar um objeto para o administrador da sala (com aquele velho método conhecido). Para fazermos isso, usaremos a função construtora (:new) da classe criada; ela receberá os argumentos referente às variáveis na ordem de declaração no método Class.new: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 local _, err= pcall(nil) Pronto! Com isso você poderá movê-lo usando o método move criado, vamos fazer teletransportes aleatórios? Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 local _, err= pcall(nil) Como dito anteriormente, essa classe tem suporte a métodos/variáveis privadas e a métodos estáticos/get. Vocês verão como criá-las aqui: Vamos reutilizar parte da classe anterior para fazer esse exemplo: Code Lua 1 2 3 4 5 6 7 8 9 10 local _, err= pcall(nil) Vamos colocar dados fictícios no nome desse jogador, como quantia de dinheiro e senha, coisas geralmente privadas. No atual código, esses dados poderia simplesmente serem acessados com o objeto gerado, o que seria uma violação da privacidade: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 local _, err= pcall(nil) Vamos tornar essa variáveis privadas agora! Para fazer isso, é só escrever "priv:" na frente das variáveis que você quer privatizar. Com isso, somente métodos do objeto poderão acessá-la, veja: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 local _, err= pcall(nil) Você poderá privatizar suas métodos também também, colocando "priv:" no nome deles: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 local Classe_qualquer= Class.new() Métodos estáticos são aqueles que chamamos diretamente através da classe criada. Geralmente são usadas quando queremos uma mesma ação para vários objetos, mas não haveria a necessiade de injetarmos o método no objeto. Vamos criar uma classe Block e testemos as propriedades x e y para verificarmos! Mas antes, usaremos o método setDefaultValues para darmos um valor padrão às variáveis. Funciona de forma parecida com a função construtora, os valores são dados na ordem de declaração: Code Lua 1 2 3 4 5 6 7 local Block= Class.new("x,y") Para criarmos a função estática move (vamos mudar sua posição), usaremos a função ?static, que receberá o nome da função e uma callback. Lembrando que a callback também suportr a var args: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 local Block= Class.new("x,y") Outro tipo de método que você pode criar é o do tipo get. O Método Get é aquele que você não chama como se fosse uma função, mas como se fosse uma variável. Assim, ele poderá executar algo e retorná-lo sem se preocupar com parâmetros. Para criar um método get é só você adicionar a palavra "get:" antes do nome do método, conforme o exemplo: Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 local players= {} --guarda o dados dos players Você também pode criar classes extendidas. Elas possuem muitas funções, e sua principal é criar várias classes filho que procedem de uma classe pai, por possuírem características semelhantes. Para fazer isso, use o método Class.extended, que receberá a classe pai e os argumentos da nova classe. Os argumentos, isto é, a string para criação de variáveis, e os métodos da classe pai será herdados pelo filho, assim como os métodos estáticos. Todos os métodos de criação do Class.new são acessíveis pelo Class.extended. Veja abaixo um exemplo genérico do que é possível fazer. Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 local _, err= pcall(nil) Veja aqui as informações adicionais sobre o script: Informações Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 --[[ Code Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 --[[ |
Belizard « Censeur » 1630625820000
| 1 | ||
Que shoow! Seja bem-vindo novamente ;) |
Ninguem « Consul » 1630633500000
| 1 | ||
Ficou muito bom, parabéns! |
Jp_darkuss « Citoyen » 1630685580000
| 0 | ||
Belizard a dit : Obrigado :), talvez ainda faça mais coisas rsrsrs Dernière modification le 1630685640000 |
Jp_darkuss « Citoyen » 1630685640000
| 0 | ||
Ninguem a dit : Vlw, espero que ela ajude com seus projetos futuros ;) |
Gamedroit « Citoyen » 1631029680000
| 2 | ||
Parabéns! Mas eu não chamaria o uso de metatabelas e funções de classe nativa, é bem diferente da realidade. Outra coisa, o problema de privacidade que você apontou pode sim ser resolvido em metatabelas usando o metamethod __index para controle de saída de informação, e você pode usar o metamethod __newindex para controle de entrada de informação. Com inspiração no que você fez, e para provar que com metatabelas você pode sim criar variáveis privadas, eu decidi fazer meu próprio sistema: https://pastebin.com/baGsL6nL ou https://pastebin.com/raw/baGsL6nL PS: Foi testado em Lua 5.3, não sei se teria algum problema em versões anteriores. PS2: Talvez não seja o melhor método para criar classes, porém seria útil em sistemas pequenos ao qual você se preocupa em manter algumas variáveis invisíveis ao utilizador. Dernière modification le 1631208600000 |
Jp_darkuss « Citoyen » 1632186840000
| 0 | ||
Gamedroit a dit : É verdade, não pensei por esse lado. Gostei do código :) |