【问题标题】:Collision accuracy碰撞精度
【发布时间】:2014-02-26 16:49:47
【问题描述】:

不太清楚如何用这个词,但我一直在使用

if (CGRectIntersectsRect(ball.frame, bottom.frame)) {
    [self finish ];
}

对于我的碰撞检测,它完美地运行代码,但球有时会与底部碰撞并运行代码,但您可以清楚地看到对象之间存在间隙。我自己创建了图像,它们周围没有背景。我想知道是否有任何其他方式对其进行编码或制作,以便在将 x 数量的像素相交之前它不会运行代码。

【问题讨论】:

  • 哎呀——我应该有 Xed Xcode 的时候 Xed iOS。
  • CGRect intersectRect = CGRectIntersection(ball.frame, bottom.frame); if (intersectRect.size.width >= yourMinimum && intersectRect.size.height >= yourMinimum){[self finish];}?
  • 致 OP:这与 Xcode 无关。

标签: ios objective-c collision-detection


【解决方案1】:

您可以通过多种方式实现球线碰撞。您的解决方案实际上是一个矩形 - 矩形碰撞检测。这是我在一个小型游戏项目中的做法。它给了我最好的结果,而且很简单。

假设一个球有一个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 等于 0,则存在一个交叉点——完美碰撞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多