Ir para o conteúdo

Exemplo: Xenon

De modo a aplicar os conceitos apresentados anteriormente, vamos desenvolver um pequeno jogo de naves, um clone do Xenon. Vamos tentar com este simples programa aplicar os conceitos de herança, encapsulamento, polimorfismo e composição. Bem como fazer uso de todas as características da linguagem e de genéricos.

Criar jogos é um processo que envolve muitos conhecimentos, mais dos que os que foram apresentados até ao momento, de tal forma que muito do código que estará presente no projecto não estará ligado directamente ao projecto mas será necessário para que as nossas classes funcionem. Não faz parte deste tutorial ensinar como desenvolver jogos, motores de jogos, criação de Sprites e outros temas associados ao desenvolvimento de jogos. Dessa forma será explicado, nesta página, apenas o código relevante à aprendizagem da linguagem Java.

Para facilitar o nosso desenvolvimento iremos usar uma biblioteca chamada Slick2D.

Objectivos Gerais

Pretendemos desenvolver um jogo de naves, shut'em up, onde o jogador controla uma nave e vai eliminando os vários inimigos que surgem. Por cada inimigo eliminado o jogador recebe uma quantidade de pontos. Certos inimigos podem oferecer prémios que permite aumentar as capacidades da nave que o jogador controla.

Questões que Afectam o Desenvolvimento

O desenvolvimento do nosso jogo foca a aplicação de POO e da tecnologia Java e não a correcta implementação de um jogo deste tipo. Existirão várias escolhas que faremos que não oferecem vantagens a nível de performance do jogo ou de facilidade de edição (ex: o mapa do jogo) mas que são as mais correctas tendo em conta os conceitos a aprender ou não são suficientemente relevantes para serem implementadas de uma forma mais correcta e mais morosa.

Deverá ser tido em conta que o objectivo principal deste exemplo é a aplicação correcta dos conceitos de POO e não a forma de optimizar aplicações feitas em Java nem a forma correcta de implementar um jogo 2D de naves.

Descrição dos Elementos do Jogo

O nosso jogador controla uma nave, a uma velocidade pré-determinada, acumula pontos ao matar inimigos, pode danificar os inimigos com os tiros de dispara da sua arma e colidindo com os inimigos. Ao colidir com inimigos ou com tiros de inimigos, a energia da nave irá sendo reduzida, até que ao chegar a zero, a nave será destruída.

O jogador terá à sua disposição um valor limitado de naves com que inicia o jogo, quando gastar todas as naves por estas terem sido destruídas, o jogo termina.

Caso o jogador consiga levar a nave até ao fim do nível, será transportado para no nível seguinte ou, caso não existam mais níveis, o jogo terminará.

Durante a execução do nível, vários inimigos podem surgir com o intuito de destruir a nave. Todos estes inimigos terão uma capacidade de resistência, um número de pontos que serão atribuídos à nave quando os inimigos morrem, e um movimento que irá fazer com que se desloquem pelo mapa. Alguns inimigos poderão disparar se possuírem armas.

Existem também grupos de inimigos que se movem em conjunto e que, caso todo o grupo seja destruído pelo jogador, poderão oferecer um prémio.

Os prémios podem afectar a velocidade da nave, oferecer vidas, tipos de tiros diferentes ou componentes para adicionar à nave e aumentar o poder de fogo da mesma.

Inimigos:

  • Ball - Inimigo sem arma e com movimento linear, pode também agrupar-se para formar um grupo de inimigos, Bees;
  • Bee - Inimigo sem arma e com movimento linear;
  • WallWalker - Inimigo que se desloca pelas laterais do mapa, com movimento linear vertical;
  • Mine - Pequeno inimigo sem arma mas que tenta atingir a nave seguindo-a sempre; Este tipo de inimigo é libertado pelo inimigo Transport quando este morre;
  • SmallAsteroid - Pequena pedra com movimento linear e sem arma;
  • Stalker - Segue a nave, para onde ela se deslocar e dispara tiros em direcção à mesma;
  • Transport - Não tem armas mas transporta um número variável de outros inimigos Mine e possui um movimento linear;
  • Urchin - Inimigo sem arma e com movimento linear;
  • Bees - Grupo de inimigos Bee. O número de inimigos é variável e o movimento deverá ser sempre linear vertical ou horizontal.

Prémios:

  • ComponentPowerUp - Oferece um componente à nave;
  • DoubleShotPowerUp - Oferece um tipo do tipo DoubleShot;
  • EnergyPowerUp - Oferece mais energia à nave;
  • MissilePowerUp - Oferece um tiro do tipo MissileShot;
  • ScorePowerUp - Oferece mais pontuação ao jogador;
  • SpeedPowerUp - Incrementa a velocidade da nave;
  • TripleShotPowerUp - Oferece um tipo do tipo TripleShot.

Movimento:

  • DependentMovement - Um movimento dependente que altera a posição do elemento controlado com base num outro elemento. Desta forma é possível ter um inimigo que ande sempre preso a outro ou um componente da nave que acompanhe os movimentos da nave;
  • HomingMovement - Movimento que implementa um algoritmo de pesquisa de alvos, seguindo sempre em direcção ao alvo definido;
  • LinearMovement - Movimento linear, horizontal, vertical ou diagonal.

Tipos de Tiros:

  • DoubleShot - Tiro com poder de destruição duplo associado à arma da nave;
  • EnemyBullet - Tiros disparados pelas armas dos inimigos com arma;
  • MissileShot - Misseis disparados pela arma da nave;
  • SimpleShot - Tiro simples atribuído à arma da nave;
  • TripleShot - Tiro com poder de destruição triplo associado à arma da nave.

Componentes para a Nave:

  • Wing - Componente que fica do lado direito ou do lado esquerdo da nave e que acompanha sempre o seu movimento. Uma nave só pode ter dois componentes deste tipo, um do lado direito e um do lado esquerdo.

Modelação do Problema

Implementação do Jogo

Download de Ficheiros

Descrição do Motor Usado

Slick2D é uma biblioteca que permite o desenvolvimento de jogos em Java com utilização de OpenGL através da biblioteca LWJGL. A biblioteca Slick2D não é mais que um wrapper em torno da biblioteca LWJGL, permitindo uma utilização facilitada e uma API amigável para o desenvolvimento de jogos em Java.