Ir para conteúdo
Poccnn

tfs 0.3 Tutorial SPOO Lua.

Posts Recomendados

Fala Xtibianos.
Vim passar um pouco do que aprendi como programar usando SPOO lua. 


SPOO > Simulação de programação orientada a objeto. 

Lua, não é uma linguagem orientada a objeto, ela apenas simula isso. 

 

Vamos ao que interessa

Para criar um objeto, primeiro cria-se uma estrutura: 
 

Citar

_veiculo = {} -- estrutura (tabela); estou usando uma variavel apenas para dar um nome a essa estrutura. 

 

A estrutura pode ter valores inseridos nela. 

Citar

_veiculo.nome = "sem nome" 
_veiculo.cor = "sem cor" 

 

Agora vamos criar metodos (function) para manipular os valores dentro da estrutura. 

Citar

 

function _veiculo:getName() 
   return self.nome 
end 

function _veiculo:setName(name) 
   self.nome = name 
end 

function _veiculo:getCor() 
   return self.cor 
end 

function _veiculo:setCor(cor) 
   self.cor = cor 
end 

 

 

Agora voce pode usar os metodos para manipular os dados 

Citar

 

_veiculo:setName('poccnn') 
_veiculo:setCor('preto') 

print(_veiculo:getName(),_veiculo:getCor()) 
Saida gerada por esse codigo >> poccnn, preto 

 

 

Mas há um problema, só existe um objeto para ser manipulado; e se eu quiser maanipular mais obejtos do mesmo tipo? 

para isso, lua dispõe de uma função que cria uma metatabela, ou seja, uma tabela que contem os dados originais dessa tabela e mais algumas peculiaridades proprias desse sistema. 

 

Se voce quiser se aprofundar em saber como funciona a herança em spoo lua, veja esse tutorial.

Para criar um novo objeto; vamos criar um metodo que faça isso usando a função setmetatable: 

setmetatable(table,metatable) 

 

Citar

 

function _veiculo:newObjeto(obj) 
   obj.__index = _veiculo -- determinação de indice; mesmo tendo como padrao de indice o proprio objeto, ao ser passado como valor, fica requisitado que seja declarado o indice para o mesmo. 
   return setmetatable({},obj) -- usei uma tabela vazia. 
end 

 

Dois objetos criados com esse metodo.

Citar

local opala = _veiculo:newObjeto(_veiculo) 
local fusca = _veiculo:newObjeto(_veiculo) 

 

 

 dessa forma, esse novo objeto que foi criado e atribuido as variaveis de nomes opala e fusca, pode usar os metametodos já criados para o objeto principal (_veiculo). 

 

Citar

opala:setName('opala') 
opala:setCor('preto') 
fusca:setName('fusca') 
print(opala:getName(),opala:getCor()) 
print(fusca:getName(),fusca:getCor()) 

 

Saida gerada por esse codigo >> 
   opala,   preto 
   fusca,   sem cor 

 

 

Veja que a cor não foi definida para o objeto fusca, então ele retorna o valor padrão que foi declarado na estrutura principal >> _veiculo.cor = "sem cor". 

 

Lua dispõe de varios elementos (variaveis) chaves para manipulação de metatabelas; aqui vou comentar sobre algumas delas: 

Citar

 

__index >> voce declara qual o indice que o sistema vai procurar os valores declarados para o objeto utilizar. 
__metatable >> voce determina qual o objeto que será retornado quando for chamado pela função getmetatable(object). 
__call >> toda vez que usa um metodo no objeto, esse elemento é chamado e aparti dai voce pode determinar o que vai fazer essa chamada. 
__newindex >> declara um novo caminho para inserção de dados ou chamadas de dados. 
__tostring >> caso voce queira imprimir os dados de um objeto, esse elemento sera chamado para obter a string para ser imprimida. 

eu não vou comentar os demais elementos, devido minha ignorancia dos mesmo. 

 

 

Agora vamos por em pratica esses elementos para entendermos melhor seu funcionamento: 


Usando o parametro __index 
ao ser declarado o indice, é usado os valores apontado pelo mesmo. 
 

Citar

local novoCarro = setmetatable(_veiculo,{__index = _veiculo}) 
print(novoCarro:getName(),novoCarro:getCor()) -- usando os metametodos declarados em _veiculo.

 


Usando o parametro __metatable 
Usando esse parametro, voce apenas declara qual sera o objeto retornado. 
 

Citar

 

local corcel = setmetatable({},{__index = _veiculo, __metatable = opala}) --determinei que a metatabela seja o objeto opala descrito acima 
corcel:setName('corcel') -- nesse novo objeto criado, marquei o nome dele como corcel. 
print(getmetatable(corcel):getName()) -- ao ser chamado o objeto, ele retorna o objeto opala, por isso o nome pego, veio do objeto opala e nao desse novo objeto criado acima. 

Saida gerada por esse codigo >> opala. 


Usando o parametro __call 
Toda a chamada que for feita a esse objeto, pode ser processada usando o parametro call. 
 

Citar

 

function _veiculo:getNameByobjName(name) 
   setmetatable({},_veiculo) 
   self.__index = _veiculo 
   self.__call = function(self,value) 
   local lfor = value == 'opala' and opala or value == 'fusca' and fusca or _veiculo 
      if(lfor:getName() == "sem nome")then 
         return "Insira um nome no veiculo..." 
      else 
         return lfor:getName() 
      end 
   end 
   return self.__call(self,name) 
end 
print(corcel:getNameByobjName('opala'),corcel:getNameByobjName('fusca'),corcel:getNameByobjName('monza')) 

 

Saida gerada por esse codigo >> 
opala 
fusca 
Insira um nome no veiculo... 

 


Usando o parametro __newindex

Ao usar esse parametro, voce declara para onde vai ou onde vai buscar os valores do objeto.

 

Citar

 

local impala = setmetatable({},{__index = _veiculo, __newindex = opala}) 
-- todos os elementos declarados para esse objeto impala, não ficam nesse objeto e sim, vão para o objeto declarado em __newindex. 

 

impala.combustivel = "gasolina" -- declarado uma varivel. 
function impala:setPower(power) -- declarado novos metametodos. 
   self.power = power 
end 

function impala:getPower() 
   return self.power 
end 

opala:setPower(200) -- somente o objeto declarado em __newindex é que pode se fazer do uso dos elementos adicionados. 

print(opala.combustivel,opala:getPower()) -- pegando os elementos dentro do objeto opala. 

 

Saida gerado por esse codigo >> gasolina,   200 

 

 

E por ultimo o elemento __tostring 
__tostring serve como elemento para receber uma string para outros fins que não sejam metametodos. 
 

Citar

 

local marverick = setmetatable({},{__index = _veiculo, __tostring = function() return "Essa é uma super-maquina!!!" end}) 
print(marverick) 

 

Saida gerada por esse codigo >> Essa é uma super-maquina!!! 

 

 

Bem é isso pessoal espero que tenham entendido. 

Me corrijam caso tenha errado algo.

Editado por Poccnn
Inserção de informações/formatação

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Marshmello
      Fala pessoal Então tava sem nada pra fazer decidir ajudar um pouco quem ta começando
       
      Trazendo Exemplo de quest (tanto item e pokemon)
       
      Então vamos lá
       
      Exempo de quest Que ganha Item
      --[[ Script: Exemplo Quest Item AUTOR: Brendo Hiesttfer EMAIL: [email protected] ]] function onUse(cid,item,fropos,topos) storage = 587954 -- Storage da quest (troque quando for fezer outra quest) item = 9999 -- id do Item valor = 1 -- quantidade de item que o player vai ganhar na quest itemname = "NomeItem" -- nome do Item que vai ser ganho na quest level = 1 -- Level minimo para completar a quest if getPlayerStorageValue(cid,storage) == -1 then if getPlayerLevel(cid) >= level then doPlayerAddItem(cid,item,Valor) doPlayerSendTextMessage(cid,25, "Parabéns você ganhou um "..itemname.." como premio") -- Msg ao completar a quest setPlayerStorageValue(cid,storage,1) else doPlayerSendTextMessage(cid, 26, "Desculpe, mais você precisa ter no minimo level "..level.." para completar a quest") --- Msg quando não tiver o level end else doPlayerSendTextMessage(cid,26, "Você já pegou oque estava dentro") -- Msg quando tentar fazer novamente end return true end  
      EXEMPLO QUEST QUE GANHA POKEMON:
      --[[ Script: Exemplo Quest Pokemon AUTOR: Brendo Hiesttfer EMAIL: [email protected] ]] function onUse(cid,item,fropos,topos) storage = 587954 -- Storage da quest (troque quando for fezer outra quest) pokemon = "Pikachu" -- Pokemon Que o player vai ganhar TypeBall = "Normal" -- type da ball level = 1 -- Level que precisa para completar a quest if getPlayerStorageValue(cid,storage) == -1 then if getPlayerLevel(cid) >= level then addPokeToPlayer(cid,pokemon,0 ,nil ,TypeBall) doPlayerSendTextMessage(cid,25, "Parabéns você ganhou um "..pokemon.." como premio! ") -- Msg ao completar a quest setPlayerStorageValue(cid,storage,1) else doPlayerSendTextMessage(cid, 26, "Desculpe, mais você precisa ter no minimo level "..level.." para completar a quest") --- Msg quando não tiver o level end else doPlayerSendTextMessage(cid, 26, "Você já fez essa quest") -- Msg quando tentar fazer novamente end return true end E isso coisa simples para quem está começando agora com poketibias , abraços ♥
    • Por moskitinho
      Olá camaradas,
       
      Voltei ao fórum depois de anos e queria encontrar alguém para me ajudar num projeto de OT 8.6 o mapa esta pronto, o que falta é configurar as quests e eventos. Eu procurei em fóruns e tutoriais de todas as maneiras, mas não consegui aprender. As distros de hoje em dia vem com muitos scripts bagunçados e fica difícil pra aprender apenas copiando. Porque na maioria dos casos o que funciona em um server não funciona no outro.
       
      Então deixo registrado aqui meu pedido.
       
      Procura-se um Action/Script Maker
       
      Moskitinho o que é esse projeto?
      - É um OT Server 8.6 com mapa próprio.
      - A cidade principal é Carlin que foi renomeada para Draenor. E modificada para se ajustar a parte do RPG.
      - As hunts serão por portal (mas nada de caves sem graça e cheia de retas) usei respawns famosos do global para melhorar o aspecto visual das hunts.
      - Não teremos itens VIP ou mesmo o VIP System. Todos os jogadores tem acesso à 100% do conteúdo. (Sujeito a modificação)
      - Vocações balancedas. (fast attack moderado e os regens de mana e life configurados corretamente para não ser tão fácil)
      - Sou um RPG Maker e talvez muitos pensem que OTs com rates altas não consigam juntas ambas as coisas, mas é essa barreira que quero derrubar.
      - As rates começam em 600x e param em 3x a partir do nível 800. (Tudo sujeito a modificação depois de testes)
       
      O que precisa saber?
      - Configurar quests como Annihilator, Demon Helmet, Pits of Inferno, Inquisition e Wrath of the Emperor. 
       
      Obs.: A maior parte destas quest no server foi diminuída ou modificada para facilitar.
       
      Horários?
      - Sem pressa amigo, trabalhe em tempo livre. Eu não quero ocupar tempo, apenas concluir este projeto. Se não puder fazer, mas puder me ensinar eu aceito.
       
      Porque você deve aceitar?
      - Tenho alguns anos na área e qualquer membro antigo do Éks pode afirmar minha credibilidade. Quero muito lançar esse server que é particularmente um sonho pessoal. Como disse acima eu não quero tudo na mão, estou disposto a ajudar no que puder e aprender também.
       
      Bom pessoal é isto. Os interessados por favor preencham a ficha abaixo e respondam aqui no fórum ou podem me adicionar no facebook @felipelotz ou skype f_lotz

       
       
       
      E galera volto a repetir se você não quiser configurar, mas souber e puder me ensinar eu vou ficar muito grato.
       
      Agradeço desde já,
      Felipe.
       
       
       
    • Por LLossavaro
      Olá pessoal, estou procurando um scripter LUA avançado para meu servidor de pokemon, preços a combinar, estamos com meta para abrir no meio do ano.
       
    • Por meubk
      Venda proibida!
    • Por login12
      Estou procurando alguem para realizar uma modificação em minha Source.

      Posso pagar pelo serviço!



      Preço: ( à combinar )

      Preciso o mais rápido possível, então se você é scripter, e se considera profissional, ou seja que entende

      do assunto, por favor poste neste topico.







      Deixe seu skype, ou facebook se possivel

      __

      Obrigado

×