Suporte no desenvolvimento de jogos


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

    CDZ
    CDZ
    Novato
    Novato

    Mensagens : 22
    Créditos : 0
    Cash : 0

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

    Mensagem por CDZ em 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);
    }

      Data/hora atual: Ter Out 22, 2019 9:30 am