[Java]Sistema de colisão para games 2D Hitskin_logo Hitskin.com

Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o temaVoltar para a ficha do tema

Aldeia RPG
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

[Java]Sistema de colisão para games 2D

Ir para baixo

[Java]Sistema de colisão para games 2D Empty [Java]Sistema de colisão para games 2D

Mensagem por CDZ Seg maio 20, 2019 2:48 pm

Tipo: Tutorial
Nível: Intermediário.
Linguagem: java.
Contato e mais informações:   : https://lucasindiesh1p.wordpress.com/ 
Mais tutorais sobre:https://lucasindiesh1p.wordpress.com/2019/05/20/javasistema-de-colisao-para-games-2d/ 

Para fazer sistemas de colisões é necessário definir ou obter a coordenada x, coordenada y, altura e largura do alvo e então programar dentro do loop do seu game para verificar constantemente se esses atributos do alvo estão ou não iguais as variáveis do objeto que ira colidir . Por isso, é necessário utilizar condições nesse caso, e pode ser, também, útil criar métodos “get” para pegar o valor de cada uma das variáveis acima citadas. Isso vai depender do que preferir.
No java há a classe Rectangle e seu metodo intersects para fazer essa condição comparativa de forma fácil, de forma que bastará colcoar apenas os dois retangulos como parâmetros ao chamar o método)
https://docs.oracle.com/javase/7/docs/api/java/awt/Rectangle.html#intersects(java.awt.Rectangle)
Para isso, cria-se um retângulo para cada objeto do seu game, e atribui parametros (coordenadas x, y, altura e largura),dos retangulos criados, identicos aos dos objetos, e então, dentro do loop do seu game é só colocar o método intersect para ficar constanteente sendo chamado e checando quando ouve a interseção dos retangulos, quando houver, significa que houve colisão.
Outra alternativa é utiizar apenas condições e variáveis dos objetos (sem a criação de retângulos), por exemplo:

Código:
if(this.projetil_y == 50 && (this.projetil_x == 162|| this.projetil_x == 166 || this.projetil_x == 170 || this.projetil_x == 174 || this.projetil_x == 178 || this.projetil_x == 182 || this.projetil_x == 186 || this.projetil_x == 190 || this.projetil_x == 194 || this.projetil_x == 198|| this.projetil_x == 202)){
// colidiu! implementação do que acontece se colidir vem aqui.
}


No caso acima o programador já tinha os dados de todas as coordenadas possíveis  e ele apenas colocou todas elas numa condição. No caso, ele só precisava colidir objetos de maneira horizontal, por isso só utilizou apenas a coordenada x (variavel que ele criou chamada “projetil_x”). E não precisou da y e da altura e largura, mas caso precisasse, teria que saber ou descobrir cada valor possivel de colisão para atribuir as coordenadas y, já que não está utilizando o método intersects da classe Rectangle.
Sabendo o poto inicial do objeto colisor e seu trajeto, é possivel descobrir todas as coordenadas possiveis para a colisão, simplesmente deixando o programa rodar sem o sistema de colisão ainda implementado e observar em que momento(em quais coordenadas) os dois objetos se sobrepõe.
Uma maneira de descobrir as coordenadas e quando elas vão colidir é implementar temporariamente no seu game que ele as exiba.(Como? simples, desenhando na tela com o drawString, dentro do método do seu game responsável por desenha-lo [paint ou paintComponent]) então  anota-se as coordenadas do projetil, por exemplo, quando ele chegar em cima do alvo
Por exemplo: (vai ficar exibindo todas as coordenadas na tela):

Código:
//Exibir coordenadas do projetil:
public void paintComponent(Graphics g) {
super.paintComponent(g);
//…
g.setColor(Color.white);
g.setFont(new Font(“Century Gothic”, Font.BOLD, 10));
g.drawString(“projetil_x:”+projetil_x, 0, 20);
g.drawString(“projetil_y:”+projetil_y, 0, 40);
}
CDZ
CDZ
Novato
Novato

Mensagens : 22
Créditos : 0

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos