2010-08-22 6 views
1

J'ai une classe de détection de collision qui fonctionne en trouvant la distance entre les centres et si cette distance est suffisamment petite pour être une collision (voir Collision Detection error). Mon problème est de faire en sorte que cela fonctionne réellement, avec des ellipses entrant en collision. Je vais vous expliquer plus si nécessaire. ThxMise en œuvre de la détection de collision

+0

qui spécifie l'emplacement (rotation, etc.) d'une ellipse? ou voulez-vous dire des cercles? – raisyn

Répondre

2

La meilleure façon serait de mettre en œuvre par détection de collision de pixels lorsque les images se chevauchent, vous pouvez en lire plus à ce sujet dans les liens suivants

http://www.codeproject.com/KB/game/collision3.aspx

Per-pixel collision problem in C#

J'ai aussi un problème comme ceci pour un projet il y a quelques années quand j'avais besoin de détecter si deux cercles se chevauchaient où j'ai utilisé le code suivant

public static bool Intersect(Rectangle rectangle1, Rectangle rectangle2) 
    { 
     if (((rectangle1.X < (rectangle2.X + rectangle2.Width)) && (rectangle2.X < (rectangle1.X + rectangle1.Width))) && (rectangle1.Y < (rectangle2.Y + rectangle2.Height)) && (rectangle2.Y < (rectangle1.Y + rectangle1.Height))) 
     { 
      Vector2 rect1Centre = new Vector2(rectangle1.X + rectangle1.Width/2, rectangle1.Y + rectangle1.Height/2); 
      Vector2 rect2Centre = new Vector2(rectangle2.X + rectangle2.Width/2, rectangle2.Y + rectangle1.Height/2); 
      double radius1 = ((rectangle1.Width/2) + (rectangle1.Height/2))/2; 
      double radius2 = ((rectangle2.Width/2) + (rectangle2.Height/2))/2; 

      double widthTri = rect1Centre.X - rect2Centre.X; 
      double heightTri = rect1Centre.Y - rect2Centre.Y; 
      double distance = Math.Sqrt(Math.Pow(widthTri, 2) + Math.Pow(heightTri, 2)); 

      if (distance <= (radius1 + radius2)) 
       return true; 
     } 
     return false; 
    } 

Pas très beau code, mais je l'ai écrit à faire mon premier jeu XNA

+0

rectangle1.X est la coordonnée X du centre du rectangle et rectangle1.Y est la coordonnée Y –

+0

Acclamations homme mais comment puis-je le faire appliquer aux objets existants, plutôt que ceux créés par la méthode? – Apophis

+0

@NeoHaxxor Je dépend vraiment du nombre d'objets que vous avez, je n'ai eu que 3 cercles (c'était un jeu Air Hockey) donc j'avais un gestionnaire d'évènement sur chacun et chaque fois que l'un d'eux bougeait je le vérifiais par rapport aux autres rectangles. Si vous avez beaucoup d'objets à vérifier, il existe probablement de bien meilleurs moyens. –

2

J'ai eu le même problème récemment. Le chevauchement des cercles est facile à déterminer. Avec les ellipses c'est plus compliqué, mais pas si mal. Vous jouez avec l'équation d'ellipse pendant un certain temps, et le résultat arrive:

//Returns true if the pixel is inside the ellipse 
public bool CollisionCheckPixelInEllipse(Coords pixel, Coords center, UInt16 radiusX, UInt16 radiusY) 
{ 
    Int32 asquare = radiusX * radiusX; 
    Int32 bsquare = radiusY * radiusY; 
    return ((pixel.X-center.X)*(pixel.X-center.X)*bsquare + (pixel.Y-center.Y)*(pixel.Y-center.Y)*asquare) < (asquare*bsquare); 
} 

// returns true if the two ellipses overlap 
private bool CollisionCheckEllipses(Coords center1, UInt16 radius1X, UInt16 radius1Y, Coords center2, UInt16 radius2X, UInt16 radius2Y) 
{ 
    UInt16 radiusSumX = (UInt16) (radius1X + radius2X); 
    UInt16 radiusSumY = (UInt16) (radius1Y + radius2Y); 

    return CollisionCheckPixelInEllipse(center1, center2, radiusSumX, radiusSumY); 
} 
+0

À votre santé l'homme. Juste une chose de plus - être capable de faire que la méthode déclenche une méthode translatetransform? Les détails du code ne sont pas un problème, je l'ai codé, juste en ayant le code ci-dessus retourné vrai et en déclenchant ce code. THX – Apophis

Questions connexes