Um jogo de navinhas destruindo asteróides.
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.
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.
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);
}
//...
}
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
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:
- 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
- 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>
>e;min<sub>2</sub>
emin<sub>1</sub>
<e;max<sub>1