Detecção de Colisões Entre Sprites [Wiki Portugal-a-Programar]
Está aqui: Wiki P@P » Desenvolvimento Geral » Java » Introdução » Detecção de Colisões Entre Sprites
dev_geral:java:gamedev:deteccao_de_colisoes_entre_sprites
Detecção de Colisões por Intersecção de Rectângulos
Detecção de Colisões por Comparação de Pixels
Detecção de Colisões por Rectângulo Encolhido
Existem três abordagens, com as suas vantagens e desvantagens inerentes, para a solução deste problema, que parecendo simples… rapidamente se torna bastante bicudo.
Uma imagem ocupa sempre um espaço rectangular, independentemente das suas áreas transparentes. Esta abordagem simplesmente verifica se os rectângulos das duas sprites se intersectam não tendo em conta a sua área transparente. Isto leva a que colisões sejam detectadas mesmo quando apenas áreas transparentes das sprites intervenientes estejam a colidir.
criar uma instância da classe java.awt.Rectangle com a mesma posição e dimensões que a sprite;
mover essa instância de Rectangle à medida que a sprite é movida;
sempre que a sprite é movida verificar se o seu Rectangle se intersecta com todos os outros Rectangle das outras sprites através do método da classe Rectangle: public boolean intersects(Rectangle r)
repetir os passos da primeira abordagem;
obter o rectângulo de intersecção entre as duas instâncias de Rectangle das duas sprites através do método da classe Rectangle: public Rectangle intersection(Rectangle r);
obter a informação binária das duas sprites nessa intersecção através dos métodos da classe java.awt.image.PixelGrabber: public boolean grabPixels() e public synchronized Object getPixels()
comparar pixel a pixel as cores dos dois arrays, se existirem dois pixels na mesma posição ambos com cores não transparentes é porque a colisão é real
criar uma instância da classe java.awt.Rectangle com as dimensões da área colidível da sprite;
sempre que a sprite é movida verificar se o seu Rectangle se intersecta com todos os outros Rectangle das outras sprites através do método da classe Rectangle: public boolean intersects(Rectangle r).
Recomenda-se o uso da terceira abordagem. A primeira é simplesmente má, e não é assim tão mais rápida ou complicada que a terceira para ser usada. A segunda embora exacta, torna-se demasiado lenta para ser usada em jogos ou outras aplicações. Tentei optimizá-la ao máximo e ainda assim não consegui atingir uma velocidade que fosse aceitável. Se alguém conseguir por favor ajude-me a melhorar este tutorial e a mim mesmo, postando aqui a implementação. A terceira abordagem é simplesmente óptima, e até à data ainda não me deparei com problemas que sentisse ter de utilizar uma detecção de colisões mais exacta que esta.
Tópico de discussão no fórum: Detecção de colisões entre sprites
dev_geral/java/gamedev/deteccao_de_colisoes_entre_sprites.txt · Última modificação em: 2018/05/14 21:37 (edição externa)