Existe-t-il un moyen bien connu (ou peut-être un morceau de code réutilisable) pour la détection de collision au pixel près dans XNA?
Je suppose que cela utiliserait également des polygones (boîtes / triangles / cercles) pour un premier test rapide pour les collisions, et si ce test indiquait une collision, il rechercherait alors une collision par pixel.
Cela peut être compliqué, car nous devons tenir compte de l'échelle, de la rotation et de la transparence.
AVERTISSEMENT: si vous utilisez l'exemple de code du lien de la réponse ci-dessous, sachez que la mise à l'échelle de la matrice est commentée pour une bonne raison. Vous n'avez pas besoin de le décommenter pour que la mise à l'échelle fonctionne.
xna
2d
collision-detection
cendres999
la source
la source
Réponses:
Je vois que vous avez marqué la question comme 2d, donc je vais continuer et vider mon code:
Edit : Bien que ce code soit presque explicite, je me sentais mal de ne pas avoir de commentaires, alors j'en ai ajouté;) Je me suis également débarrassé des opérations au niveau du bit car il faisait essentiellement ce que la propriété Color.A fait de manière plus compliquée ;)
la source
Bounds
?CollidesWith(Sprite other, bool calcPerPixel = true);
:)Sur l'App Hub, il existe un très ancien exemple qui vous guide à travers la détection de collision 2D, des simples boîtes englobantes aux pixels testés sur les sprites tournés et mis à l'échelle. Il a été entièrement mis à jour vers 4.0. Toute la série mérite d'être lue si vous êtes nouveau sur le sujet.
http://xbox.create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel_transformed
J'ai aussi trouvé l'approche de Riemer Grootjans intéressante dans son jeu de tir 2D. http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php
(Il lui faut un peu de temps pour y arriver ... http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Coll_Detection_Overview.php ... mais vous voudrez peut-être suivre pour voir le problème qu'il résout)
Mais je vous préviens que l'exemple de Riemers n'est pas XNA 4.0 et vous devrez peut-être faire un peu de travail pour le faire fonctionner. Ce n'est cependant pas un travail difficile ou mystérieux.
la source
Je recommande de créer une carte de collision en noir et blanc. Programmez-le de sorte que les pixels noirs soient des points de collision. Donnez également au personnage une carte de collision; Lors du traitement des cartes, utilisez un algorithme qui transformera de grands carrés de pixels noirs en rectangles de collision. Enregistrez ces données rectangulaires dans un tableau. Vous pouvez utiliser la fonction Rectangle intersecte pour rechercher les collisions. Vous pouvez également transformer la carte de collision avec la texture.
C'est un peu comme utiliser une matrice de collision mais plus avancée et vous pouvez la transformer! envisagez de créer un outil générateur de carte de collision si vous en avez besoin. Si vous le faites fonctionner, veuillez partager le code avec d'autres!
la source