圆与矩形之间的碰撞

时间:2014-03-02 22:22:35

标签: objective-c collision-detection

我遇到了圆形和矩形碰撞检测的问题。我试图用毕达哥拉斯定理来解决这个问题。但是没有一个查询有效。矩形与圆的矩形边界框碰撞。

 if (CGRectIntersectsRect(player.frame, visibleEnemy.frame)) {
   if (([visibleEnemy spriteTyp] == jumper || [visibleEnemy spriteTyp] == wobble )) {
     if ((visibleEnemy.center.x - player.frame.origin.x) * (visibleEnemy.center.x - player.frame.origin.x) +
         (visibleEnemy.center.y - player.frame.origin.y) * (visibleEnemy.center.y - player.frame.origin.y) <=
         (visibleEnemy.bounds.size.width/2 * visibleEnemy.bounds.size.width/2)) {
       NSLog(@"Check  1");
       normalAction = NO;
     }

     if ((visibleEnemy.center.x - (player.frame.origin.x + player.bounds.size.width)) *
         (visibleEnemy.center.x - (player.frame.origin.x + player.bounds.size.width)) +
         (visibleEnemy.center.y - player.frame.origin.y) * (visibleEnemy.center.y - player.frame.origin.y) <=
         (visibleEnemy.bounds.size.width/2 * visibleEnemy.bounds.size.width/2)) {
       NSLog(@"Check  2"); 
       normalAction = NO;
     }
     else {
       NSLog(@"Check  3");
       normalAction = NO;
     }
   }         
 }

1 个答案:

答案 0 :(得分:0)

以下是我在一个小型游戏项目中的表现。它给了我最好的结果,而且很简单。我的代码检测圆和线之间是否有碰撞。因此,通过检查矩形的所有4个边缘,您可以轻松地将其用于圆形 - 矩形碰撞检测。

假设一个球有一个ballRadius和一个位置(xBall, yBall)。该行定义为两个点(xStart, yStart)(xEnd, yEnd)

实现简单的碰撞检测:

float ballRadius = ...;
float x1 = xStart - xBall;
float y1 = yStart - yBall;

float x2 = xEnd - xBall;
float y2 = yEnd - yBall;

float dx = x2 - x1;
float dy = y2 - y1;
float dr = sqrtf(powf(dx, 2) + powf(dy, 2));
float D = x1*y2 - x2*y1;

float delta = powf(ballRadius*0.9,2)*powf(dr,2) - powf(D,2);

if (delta >= 0) 
{ 
    // Collision detected 
}

如果delta大于零,则球(圆)和线之间有两个交点。如果delta等于零,则有一个交叉点 - 完美碰撞。

我希望它会对你有所帮助。