这是的问题
我有5个球在屏幕上飘来飘去,上面和下面都有反弹。工作得很好。
我现在想做的是弄清楚它们中是否有任何一个相互碰撞。
我知道
if (CGRectIntersectsRect(image1.frame, image2.frame))
{
}
但这只检查两个图像,我需要检查所有图像和每个图像。。
我到处都查了,但都找不到答案,只有其他人在找同样的东西,有什么想法吗?
提前感谢
Spriggsy
编辑:
我用这个来找到CGRect并将其存储在阵列中
ball1 = NSStringFromCGRect(image1.frame);
ball2 = NSStringFromCGRect(image2.frame);
ball3 = NSStringFromCGRect(image3.frame);
ball4 = NSStringFromCGRect(image4.frame);
ball5 = NSStringFromCGRect(image5.frame);
bingoarray = [NSMutableArray arrayWithObjects:ball1,ball2,ball3,ball4,ball5,nil];
然后将其传递给碰撞检测方法
-(void)collision {
for (int i = 0; i<[bingoarray count]-1 ; i++) {
CGRect ballA = CGRectFromString([bingoarray objectAtIndex:i]);
if (CGRectIntersectsRect(ballA, image1.frame)) {
NSLog(@"test");
}
}
我想这应该能让一个球与其他球相抗衡。
因此,球1被检查对其他人,但没有检查球2对他们。这快到了吗?
}
理想的解决方案是将所有矩形存储到区间树或分段树中,以便有效地计算任何重叠区域。注意,对于您的用例,您必须将其推广到二维。
另一种有效的方法是使用K-d树来找到最近的其他球,并与最近的邻居进行比较,直到没有碰撞。
简单的方法是简单地对所有球进行迭代,并将它们与ID较高的所有其他球进行比较(以避免重复检查ball1
->ball2
和ball2
->ball1
)。
由于一次只有5个球,迭代方法可能足够快,不会在动画中丢帧,但如果你计划支持更多的球,你应该考虑一个更可扩展的解决方案,因为简单的apprepach在二次时间内运行。
这是一道有趣的小数学题,可以避免多余。
您可以创建一个图像阵列。并循环通过它,检查每个成员是否与任何连续的成员碰撞。
如果需要的话,我可以用代码拼写更多。
EDIT我无法抗拒
// the images are in imagesArray
//where you want to check for a collision
int ballCount = [imagesArray count];
int v1Index;
int v2Index;
UIImageView * v1;
UIImageView * v2;
for (v1Index = 0; v1Index < ballCount; v1Index++) {
v1 = [imagesArray objectAtIndex:v1Index];
for (v2Index = v1Index+1; v2Index < ballCount; v2Index++) {
v2 = [imagesArray objectAtIndex:v2Index];
if (CGRectIntersectsRect(v1.frame, v2.frame)) {
// objects collided
// react to collision here
}
}
}