不太确定怎么说这个,但我一直在使用
if (CGRectIntersectsRect(ball.frame, bottom.frame)) {
[self finish ];
}
对于我的碰撞检测并且它完美地运行代码但是球有时会与底部碰撞并运行代码,但是您可以清楚地看到对象之间存在间隙。我创造了我自己的图像,他们没有背景。我想知道是否有任何其他方式编码或制作它所以它不会运行代码,直到相交x像素相互之间。
答案 0 :(得分:0)
您可以通过多种方式实施球线碰撞。你的解决方案实际上是一个矩形 - 矩形碰撞检测。以下是我在一个小型游戏项目中的表现。它给了我最好的结果,而且很简单。
假设一个球有一个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等于零,则有一个交叉点 - 完美碰撞。