Skip to content

chenriquealvarenga/cefet-games-navinha

 
 

Repository files navigation

cefet-games-navinha

Um jogo de navinhas destruindo asteróides.

Descrição

Este é um jogo em que se controla uma nave que deve atirar nos asteróides... para sempre. E sem contar pontos. Com uma navinha imortal.

Funcionamento

Atualmente, o jogo está funcionando mas nenhum objeto colide com o outro. Esta atividade prática consiste em implementar os métodos que verificam se houve colisão entre objetos.

Os asteróides vão indo na direção da nave, que deve destruí-los ou desviar deles. Quando um asteróide é destruído ou sai da tela, ele é "reciclado": seu objeto na RAM é reaproveitado, recebendo uma nova forma, tamanho e posição acima da tela. Quando um asteróide atinge a nave do jogador ele também é reciclado.

Um tiro é adicionado a uma lista (Array) quando disparado e removido dela quando (i) ele sai da tela ou (ii) ele atinge um asteróide.

Detalhes da Implementação

Não foram usadas imagens neste jogo, portanto, não foi usada uma SpriteBatch. Todos os objetos estão sendo desenhados como primitivas do OpenGL: pontos, polígonos, linhas etc.

A LibGDX possui o ShapeRenderer que expõe funções de desenho dessas primitivas.

Um exemplo de uso do ShapeRenderer para desenhar um tiro a laser:

public class LaserShot {
  //...
  public void render(ShapeRenderer renderer) {
    renderer.setColor(Color.PINK);
    renderer.identity();
    renderer.translate(position.x, position.y, 0);
    renderer.rect(-WIDTH / 2F, -HEIGHT / 2F, WIDTH, HEIGHT);
  }
  //...
}

Controles

Os controles implementados são:

  • , : vai para esquerda e direita
  • d: ativa/destiva modo de debug
    • Quando em debug, os colliders de cada entidade são desenhados
  • Espaço: atira usando a arma corrente
  • Tab: troca para a próxima arma

Exercício

Você deve implementar, na classe Collision.java, os métodos para verificar a colisão de círculo com círculo (boolean circlesOverlap(Circle c1, Circle c2)) e retângulo com retângulo (boolean rectsOverlap(Rectangle r1, Rectangle r2)), sem usar a implementação da própria LibGDX para tal (rect1.overlaps(rect2) e circle1.overlaps(circle2)).

A classe Collision.java está assim:

public class Collision {
  public static final boolean circlesOverlap(Circle c1, Circle c2) {
    return false;
  }
  public static final boolean rectsOverlap(Rectangle r1, Rectangle r2) {
    return false;
  }
}

Lembre-se de que é interessante os métodos de vetores já implementados em Vector2 (e Vector3) da LibGDX. Veja a documentação do Vector2.

Para calcular a colisão entre os objetos, considere:

  1. Círculo vs círculo
  • Colidem se a distância entre eles é menor que a soma de seus raios
  • Nota: tente fazer essa verificação sem usar a operação de radiciação
  1. Retângulo vs retângulo
  • Colidem se todos os eixos (x, y, z?) colidem
  • Um eixo está em colisão se max<sub>1</sub> &gte; min<sub>2</sub> e min<sub>1</sub> &lte; max<sub>1

About

Um jogo de navinhas destruindo asteróides. Para sempre.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%