T03.+4+-+Desenvolvimento+-+Conceitos+Adquiridos

4.1Conceitos Envolvidos
Para o desenvolvimento dessa aplicação utilizamos o Gideros que utiliza a linguagem Lua. Mesmo Lua não tendo um sistema de classes propriamente dito, ela tem recurso para criar este conceito de várias formas, uma dessas é utilizando suas Meta-Tabelas e seus metametodos, porém o próprio Gideros possuí um modo de criar classes que facilita o desenvolvimento, deixando para mais adiante a necessidade de compreender as Metatabelas. Para desenvolver este Pong foi necessário utilizar além das classes(e o conceito de Orientado a Objeto), os conceitos de hierarquia, vetores para desenhar formas, colisão entre objetos instanciados, posicionamento utilizando eixos x e y, movimentação através do posicionamento do mouse, movimentação através de impulso, tipos de corpos rígidos(estático, cinemático e dinâmico) e as noções básicas da utilização da linguagem Lua e as funções do Gidero.

4.2A utilização desses conceitos durante o desenvolvimento
Tendo em visto os conceitos envolvidos as classes básicas do jogo seriam a Bola e o Batedor. A Bola se movimentaria livremente começando no centro da tela e adquirindo impulso para a direita ou esquerda. Se ela chegasse na posição limite da tela, superior ou inferior, sua velocidade no eixo y inverteria, criando uma certa barreira. Se ela colidisse com um batedor a velocidade em x inverteria. Caso passasse dos limites da tela direita ou esquerda seria adicionado um ponto para o lado oposto. Já o Batedor ficaria nos extremos da tela horizontal e teria o diferente tratamento pois seria instanciado como player um e dois, sendo o da direita controlado pelo movimento do mouse quando este estivesse clicando em cima dele e movimentando verticalmente, e o da esquerda seria controlado por uma função que faz ele se posicionar no mesmo eixo y da bola. Para enriquecer um pouco mais este projeto, lembrando do objetivo de adquirir conhecimento para novos jogos resolvemos adicionar a física do Gideros através da biblioteca Box 2D, utilizando as três formas de corpos rigidos, a limitação da tela ao invés de lógica seria física com a criação de uma classe Parede que criaria a barreira superior e inferior e um gerenciador de tela para administrar a criação dos objetos do jogo(o que permitirá a criação de um gerenciador de fases nos próximos projetos já que o jogo só existirá dentro do gerenciador de tela e assim se troco por outro o jogo pode mudar facilmente). Dessa forma o main.lua ficaria responsável por criar o mundo das colisões físicas(será explicado adiante junto com a física) pegar as dimensões do aparelho, instanciar objeto "jogo" da classe de Gtela (gerenciador de telas ) e adiciona-lo no topo da hierarquia das imagens visualizadas da aplicação. Assim o objeto jogo (da classe Gtela) se inicializaria através do construtor "function Gtela:init" instanciando os objetos da classe Bola, Batedor, Parede e TextField(classe do gideros usada para texto, para criação do placar). Ele também seria responsável pela atualização da tela e toda a jogabilidade (movimentação da bola, batedores, acréscimo de pontos no placar). A jogabilidade é feita na criação de Listeners de tipos de evento que acionarão determinado método, exemplo: Quando o jogador clica com o mouse o listener onMouseDown informa ao método Gtela:onMouseDown para executar seu código. A atualização da tela também é feita da mesma forma, com o Listener que é ativado entre cada frame mostrado.

4.2.1Interação com o mundo e os Corpos Físicos
Para existir a física é necessário antes de qualquer coisa a criação de um mundo onde essa física irá ser calculada. Objetos de mundos diferentes mesmo que ambos sejam vistos na tela não irão colidir ou interferir nas ações do outro, por isso já no //main.lua// foi criado um mundo global para que todos os corpos estejam no mesmo mundo. Esse mundo poderia ser criado no objeto jogo da classe Gtela caso as outras fases necessitem de configurações de mundo diferente, mas nesse caso só existe o Pong. As Classe Bola, Batedor e Parede tem como função criar o corpo físico e se necessário carregar a sprite, assim os objetos instanciados dessas classes serão basicamente os objetos vistos na tela sprite/corpo. Um objeto dessas classes quando instanciado incorpora para si mesmo através da palavra "//self.//" um objeto da classe Bitmap que carrega do arquivo a imagem especifica posicionando nas coordenadas passadas ao construtor e em seguida posicionando a ancora da imagem em seu centro(está ancora será usada para forças em centro de massa para evitar rotação). Após isso pega as informações de tamanho da imagem para a criação do corpo e adiciona o corpo ao objeto da classe Bitmap, depois adiciona a visualização da imagem no próprio objeto e assim ele só será visto se o objeto instanciado da classe Bola/Batedor/Parede for adicionado a hierarquia da Tela. Na criação dos corpos dessas classe, foi adotado um tipo diferente de corpo e métodos específicos para sua criação.
 * A classe Parede cria dois objetos um para a parte superior e inferior.

__//4.2.1.1Bola: Corpo Dinâmico//__
O corpo Dinâmico é aquele que melhor interage com os objetos do mundo, ele pode se movimentar, receber e dar força ou impulso. O melhor exemplo de corpo dinâmico é objetos da classe Bola que precisam interagir com todos os corpos do mundo, alterando sua velocidade e direção a cada contato. Para criação do corpo Dinâmico basta apenas cria um DYNAMIC_BODY no mundo, mas é preciso dar a forma de uma bola ainda. Para isso com as informações do tamanho da imagem em cálculos anteriores criamos um objeto do tipo CircleShape com as informações do centro de massa e o raio que é o tamanho da imagem e criamos uma variável do tipo Fixture para adicionar características como densidade, fricção e coeficiente de restituição com base no objeto circulo criado. Após isto é adicionado o corpo criado nos atributos de corpo do objeto Bitmap criado anteriormente.

//__4.2.1.2Batedor: Cinemático__//
Um Corpo Cinemático por sua vez é ideal para o Batedor, ele pode se movimentar, usar força e impulso, mas diferente do corpo dinâmico as forças de outros corpos não interfere na sua. Sendo assim ele pode colidir com um objeto bola e não sofrer nenhuma mudança de curso. Caso ele fosse dinâmico o batedor após colidir seria empurrado para trás o que seria necessário para mascarar isso adicionar uma força oposta ou levar de volta a posição do choque ou aumentar sua densidade tanto a ponto de não ser percebido a movimentação, mas isso iria fazer aumentar a força necessária para a movimentação do objeto. Por isso o corpo Cinemático é bem mais viável. No Gideros para se criar formas existe dois meios, a criação de círculos ou de polígonos. Na criação de círculos basta apenas dizer o tamanho do raio e a posição do centro, mas para as demais formas é necessário antes criar através de vetores a forma. No caso do Batedor a forma é um retângulo com os cantos arredondados, para não complicar muito consideramos apenas um retângulo. Então criasse um objeto da classe Shape e com seu método beginPath começamos a dar as coordenadas dos pontos que serão ligados formando nossa forma. O primeiro ponto é criado através do método moveTo(x,y) e os demais lineTo(x,y)(os valores de x e y são retirados das medidas de largura e altura conhecidos anteriormente). Com o método closedPath unimos os pontos de começo e fim e depois usamos endPath para encerrar a forma e posicionar no seu devido lugar. Com a forma pronta criamos um corpo no mundo do tipo KINEMATIC_BODY, criamos um objeto da classe PolygonShape para receber as informações da forma criada e os mesmos passos seguintes da criação de Fixture junção com um objeto que recebe a imagem do Batedor.

//__4.2.1.3Parede: Estático__//
O Corpo estático é o mais limitado de todos, mas mesmo assim muito útil. Ele não pode se movimentar ou usar força e impulso e todas as forças de outros corpos não podem interagir com ele, ou seja da forma que foi criado ele fica até ser destruído. No caso para uma parede ou solo de jogo simples esse é o corpo ideal. Na criação desse corpo não tem nada de diferente além de criar um corpo do tipo STATIC_BODY, toda a criação da forma segue o exemplo do Batedor por não ser um circulo e a junção com o objeto da classe Bitmap dos dois anteriores.

<>