{"id":6,"date":"2014-06-23T14:26:27","date_gmt":"2014-06-23T17:26:27","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/gideros\/?page_id=6"},"modified":"2015-04-12T23:34:30","modified_gmt":"2015-04-13T02:34:30","slug":"objetos","status":"publish","type":"page","link":"http:\/\/www.galirows.com.br\/meublog\/gideros\/ampliando_desenvolvimento\/objetos\/","title":{"rendered":"Orienta\u00e7\u00e3o a objetos"},"content":{"rendered":"<p>Lua \u00e9 uma linguagem que n\u00e3o suporta classes como em outras linguagens de programa\u00e7\u00e3o, como Java e C++. Em Lua \u00e9 utilizado o conceito de metatabelas e cada objeto pode definir seu comportamento atrav\u00e9s dessas metatabelas, permitindo desenvolver algo pr\u00f3ximo a utiliza\u00e7\u00e3o de classes da orienta\u00e7\u00e3o a objetos.<\/p>\n<p>Para a cria\u00e7\u00e3o de uma classe ser\u00e1 utilizada a fun\u00e7\u00e3o Core.class() que aceita como par\u00e2metro um tipo primitivo da Lua. No c\u00f3digo abaixo, como ele definir\u00e1 um aspecto visual para o elemento na tela, o tipo primitivo foi definido como um <em>Sprite<\/em>.<\/p>\n<p>O c\u00f3digo a seguir cria ent\u00e3o uma classe chamada \u201cBola\u201d em um arquivo que foi nomeado como \u201cbola.lua\u201d para facilitar a organiza\u00e7\u00e3o dos scripts. Observe no c\u00f3digo que existe uma fun\u00e7\u00e3o, sendo essa o m\u00e9todo construtor da classe, sendo chamada sempre que o objeto \u00e9 criado.<\/p>\n<p>O c\u00f3digo tamb\u00e9m mostra a cria\u00e7\u00e3o de uma vari\u00e1vel que armazena um texto, sendo que ela n\u00e3o tem uma real utilidade, apenas representando que para ter vari\u00e1veis que possam ser acessadas por qualquer m\u00e9todo da classe, essa deve ser criada fora de declara\u00e7\u00e3o dos m\u00e9todos. Como ela foi declarada como local, a vari\u00e1vel somente ser\u00e1 acessada atrav\u00e9s da classe criada.<\/p>\n<p><a href=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0651.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-218 aligncenter\" src=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0651.png\" alt=\"image065\" width=\"530\" height=\"273\" srcset=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0651.png 530w, http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0651-300x155.png 300w\" sizes=\"auto, (max-width: 530px) 100vw, 530px\" \/><\/a><\/p>\n<p>O m\u00e9todo construtor da classe leva o nome da classe acompanhando de dois pontos e a palavra \u201cinit\u201d. Argumentos podem ser passados para esse m\u00e9todo se for preciso. No construtor criado, inicialmente \u00e9 mostrada uma mensagem no output apenas para indicar a instancia\u00e7\u00e3o da classe e em seguida \u00e9 criado um elemento gr\u00e1fico que ir\u00e1 representar a inst\u00e2ncia. Veja que a adi\u00e7\u00e3o do gr\u00e1fico fez uso de duas instru\u00e7\u00f5es addChild(), sendo a primeira a defini\u00e7\u00e3o do elemento para a pr\u00f3pria instancia e a outra para inclus\u00e3o da inst\u00e2ncia na \u00e1rea cena do jogo. Sendo assim, quando a classe \u00e9 instanciada j\u00e1 ser\u00e1 adicionado o elemento gr\u00e1fico na cena, mas tamb\u00e9m poderia ser feita a inclus\u00e3o na cena somente em momento posterior atrav\u00e9s do script <em>main.lua<\/em>.<\/p>\n<p>Ap\u00f3s a especifica\u00e7\u00e3o gr\u00e1fica da classe \u00e9 criada uma vari\u00e1vel para armazenar uma velocidade sorteada para o elemento. O sorteio de valores \u00e9 feito pela instru\u00e7\u00e3o math.randam(x,y), onde x representa o menor valor de um intervalo e o y o maior valor desse intervalo. Essa vari\u00e1vel n\u00e3o foi definida como local, sendo poss\u00edvel acess\u00e1-la posteriormente por outro script. Tamb\u00e9m foi sorteada uma coordenada X para que o objeto apare\u00e7a em locais diferentes na horizontal quando criado.<\/p>\n<p>Por fim foram definidos dois ouvintes para a classe, onde o primeiro ser\u00e1 respons\u00e1vel por deslocar para baixo o objeto e o segundo far\u00e1 a remo\u00e7\u00e3o do objeto quando ele for clicado. Observe que \u00e9 passado como terceiro par\u00e2metro do m\u00e9todo o argumento \u201cself\u201d. Esse terceiro par\u00e2metro \u00e9 obrigat\u00f3rio a ser informado e n\u00e3o deve ser definido como recebido nas fun\u00e7\u00f5es que ser\u00e3o chamadas, como mostra o c\u00f3digo a seguir.<\/p>\n<p><a href=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0661.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-219 aligncenter\" src=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0661.png\" alt=\"image066\" width=\"379\" height=\"160\" srcset=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0661.png 379w, http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0661-300x127.png 300w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/a><\/p>\n<p>Toda fun\u00e7\u00e3o da classe deve iniciar com o nome da classe acompanhada de dois pontos e o nome do m\u00e9todo. Veja que na adi\u00e7\u00e3o do ouvinte foi especificada a fun\u00e7\u00e3o como <em>self.movimenta<\/em>, mas poderia ser chamada tamb\u00e9m como <em>Bola.movimenta<\/em>. A primeira fun\u00e7\u00e3o \u00e9 respons\u00e1vel por fazer o objeto descer na cena, enquanto a segunda remove o objeto da cena quando for clicado em cima do objeto.<\/p>\n<p>Para fazer uso da classe desenvolvida, no script principal devemos instanciar a classe. O c\u00f3digo a seguir instancia a classe duas vezes, criando dois objetos. Eles ser\u00e3o automaticamente adicionados na tela e come\u00e7ar\u00e3o a se mover em, dependendo do valor da velocidade sorteada, em velocidades diferentes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-220 aligncenter\" src=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0681.png\" alt=\"image068\" width=\"154\" height=\"38\" srcset=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0681.png 154w, http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0681-150x38.png 150w\" sizes=\"auto, (max-width: 154px) 100vw, 154px\" \/><\/p>\n<p>Retornando a defini\u00e7\u00e3o de velocidade, essa foi definida a partir de uma vari\u00e1vel que n\u00e3o foi declarada como local. Sendo assim, ap\u00f3s criar os objetos dessa classe no script principal, podemos acessar e alterar essa vari\u00e1vel. O c\u00f3digo abaixo se adicionado ap\u00f3s a instancia\u00e7\u00e3o dos objetos mostrar\u00e1 o valor da velocidade sorteado para o primeiro objeto criado e tamb\u00e9m alterar\u00e1 seu valor, fazendo esse objeto mover-se mais rapidamente na cena.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-221 aligncenter\" src=\"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-content\/uploads\/sites\/3\/2014\/06\/image0691.png\" alt=\"image069\" width=\"194\" height=\"27\" \/><\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"667\"><strong>Para praticar:<\/strong> mesmo sendo removido o objeto da cena, ela continua consumindo recursos dos ouvintes. Adicione ao c\u00f3digo a remo\u00e7\u00e3o dos ouvintes e tamb\u00e9m a remo\u00e7\u00e3o caso ele n\u00e3o seja clicado e saia da cena.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h1>Op\u00e7\u00e3o para remo\u00e7\u00e3o de objetos<\/h1>\n<p>Uma op\u00e7\u00e3o\u00a0 para remover objetos quando eles saem da tela, como solicitado no \u201cPara praticar\u201d \u00e9\u00a0utilizar um ouvinte espec\u00edfico que \u00e9 o ouvinte Event.REMOVED_FROM_STAGE que deve ser passado como tipo do evento. Exemplo: addEventListener(Event.REMOVED_FROM_STAGE, Bola.sair, self).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lua \u00e9 uma linguagem que n\u00e3o suporta classes como em outras linguagens de programa\u00e7\u00e3o, como Java e C++. Em Lua \u00e9 utilizado o conceito de metatabelas e cada objeto pode definir seu comportamento atrav\u00e9s dessas metatabelas, permitindo desenvolver algo pr\u00f3ximo a utiliza\u00e7\u00e3o de classes da orienta\u00e7\u00e3o a objetos. Para a cria\u00e7\u00e3o de uma classe ser\u00e1 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":4,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/pages\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/comments?post=6"}],"version-history":[{"count":4,"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/pages\/6\/revisions"}],"predecessor-version":[{"id":222,"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/pages\/6\/revisions\/222"}],"up":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/pages\/4"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/gideros\/wp-json\/wp\/v2\/media?parent=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}