Lua é uma linguagem que não suporta classes como em outras linguagens de programação, como Java e C++. Em Lua é utilizado o conceito de metatabelas e cada objeto pode definir seu comportamento através dessas metatabelas, permitindo desenvolver algo próximo a utilização de classes da orientação a objetos.
Para a criação de uma classe será utilizada a função Core.class() que aceita como parâmetro um tipo primitivo da Lua. No código abaixo, como ele definirá um aspecto visual para o elemento na tela, o tipo primitivo foi definido como um Sprite.
O código a seguir cria então uma classe chamada “Bola” em um arquivo que foi nomeado como “bola.lua” para facilitar a organização dos scripts. Observe no código que existe uma função, sendo essa o método construtor da classe, sendo chamada sempre que o objeto é criado.
O código também mostra a criação de uma variável que armazena um texto, sendo que ela não tem uma real utilidade, apenas representando que para ter variáveis que possam ser acessadas por qualquer método da classe, essa deve ser criada fora de declaração dos métodos. Como ela foi declarada como local, a variável somente será acessada através da classe criada.
O método construtor da classe leva o nome da classe acompanhando de dois pontos e a palavra “init”. Argumentos podem ser passados para esse método se for preciso. No construtor criado, inicialmente é mostrada uma mensagem no output apenas para indicar a instanciação da classe e em seguida é criado um elemento gráfico que irá representar a instância. Veja que a adição do gráfico fez uso de duas instruções addChild(), sendo a primeira a definição do elemento para a própria instancia e a outra para inclusão da instância na área cena do jogo. Sendo assim, quando a classe é instanciada já será adicionado o elemento gráfico na cena, mas também poderia ser feita a inclusão na cena somente em momento posterior através do script main.lua.
Após a especificação gráfica da classe é criada uma variável para armazenar uma velocidade sorteada para o elemento. O sorteio de valores é feito pela instrução math.randam(x,y), onde x representa o menor valor de um intervalo e o y o maior valor desse intervalo. Essa variável não foi definida como local, sendo possível acessá-la posteriormente por outro script. Também foi sorteada uma coordenada X para que o objeto apareça em locais diferentes na horizontal quando criado.
Por fim foram definidos dois ouvintes para a classe, onde o primeiro será responsável por deslocar para baixo o objeto e o segundo fará a remoção do objeto quando ele for clicado. Observe que é passado como terceiro parâmetro do método o argumento “self”. Esse terceiro parâmetro é obrigatório a ser informado e não deve ser definido como recebido nas funções que serão chamadas, como mostra o código a seguir.
Toda função da classe deve iniciar com o nome da classe acompanhada de dois pontos e o nome do método. Veja que na adição do ouvinte foi especificada a função como self.movimenta, mas poderia ser chamada também como Bola.movimenta. A primeira função é responsável por fazer o objeto descer na cena, enquanto a segunda remove o objeto da cena quando for clicado em cima do objeto.
Para fazer uso da classe desenvolvida, no script principal devemos instanciar a classe. O código a seguir instancia a classe duas vezes, criando dois objetos. Eles serão automaticamente adicionados na tela e começarão a se mover em, dependendo do valor da velocidade sorteada, em velocidades diferentes.
Retornando a definição de velocidade, essa foi definida a partir de uma variável que não foi declarada como local. Sendo assim, após criar os objetos dessa classe no script principal, podemos acessar e alterar essa variável. O código abaixo se adicionado após a instanciação dos objetos mostrará o valor da velocidade sorteado para o primeiro objeto criado e também alterará seu valor, fazendo esse objeto mover-se mais rapidamente na cena.
Para praticar: mesmo sendo removido o objeto da cena, ela continua consumindo recursos dos ouvintes. Adicione ao código a remoção dos ouvintes e também a remoção caso ele não seja clicado e saia da cena. |
Opção para remoção de objetos
Uma opção para remover objetos quando eles saem da tela, como solicitado no “Para praticar” é utilizar um ouvinte específico que é o ouvinte Event.REMOVED_FROM_STAGE que deve ser passado como tipo do evento. Exemplo: addEventListener(Event.REMOVED_FROM_STAGE, Bola.sair, self).