Existe uma maneira bem conhecida (ou talvez reutilizável de código) para a detecção de colisão perfeita em pixels no XNA?
Suponho que isso também usaria polígonos (caixas / triângulos / círculos) para um teste rápido de primeira passagem para colisões e, se esse teste indicasse uma colisão, procuraria uma colisão por pixel.
Isso pode ser complicado, porque temos que levar em conta escala, rotação e transparência.
AVISO: Se você estiver usando o código de amostra do link da resposta abaixo, saiba que o dimensionamento da matriz está comentado por um bom motivo. Você não precisa remover o comentário para que o dimensionamento funcione.
xna
2d
collision-detection
ashes999
fonte
fonte
Respostas:
Vejo que você marcou a pergunta como 2D, então vou adiante e despejo meu código:
Edit : Embora esse código seja quase auto-explicativo, eu me senti mal por não ter comentários, então adicionei alguns;) Eu também me livrei das operações bit a bit, pois fazia basicamente o que a propriedade Color.A faz de uma maneira mais complicada. ;)
fonte
Bounds
?CollidesWith(Sprite other, bool calcPerPixel = true);
:)No App Hub, há uma amostra muito antiga que mostra a detecção de colisão 2D, desde caixas delimitadoras simples até testes de pixel em sprites rotacionados e em escala. Foi totalmente atualizado para 4.0. A série inteira vale a pena ser lida se você é novo no tópico.
http://xbox.create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel_transformed
Também achei a abordagem de Riemer Grootjans interessante em seu jogo de tiro em 2D. http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php
(Ele demora um pouco para chegar a ele ... http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Coll_Detection_Overview.php ... mas você pode acompanhar o vídeo para ver problema que ele está resolvendo)
Mas aviso que a amostra do Riemers não é o XNA 4.0 e talvez você precise fazer um pouco de trabalho para executá-la. No entanto, não é um trabalho difícil ou misterioso.
fonte
Eu recomendo criar um mapa de colisão em preto e branco. Programe para que os pixels pretos sejam pontos de colisão. Dê ao personagem um mapa de colisão também; Ao processar mapas, use um algoritmo que transformará grandes quadrados de pixels pretos em retângulos de colisão. Salve esses dados do retângulo em uma matriz. Você pode usar a função de interseção de retângulo para procurar colisões. Você também pode transformar o mapa de colisão com a textura.
É muito parecido com o uso de uma matriz de colisão, mas é mais avançado e você pode transformá-la! considere criar uma ferramenta geradora de mapa de colisão, se necessário. Se você fizer isso funcionar, compartilhe o código com outras pessoas!
fonte