Objective c 检查数组中对象之间碰撞的好方法是什么?

Objective c 检查数组中对象之间碰撞的好方法是什么?,objective-c,ios,arrays,game-physics,physics-engine,Objective C,Ios,Arrays,Game Physics,Physics Engine,为了同时从数组中获取两个对象,我在另一个for循环中进行了for循环,但肯定有更好的方法。我只想检查它们是否发生碰撞,然后将它们从视图和数组中删除。是否正在寻找一种方法来查找同时位于两个不同数组中的对象 如果是这样,我建议使用NSArray的索引ObjectsPassingTest: @implementation NSArray (Comparison) - (NSIndexSet *)indexesOfObjects:(NSArray *)objects { return [self

为了同时从数组中获取两个对象,我在另一个for循环中进行了for循环,但肯定有更好的方法。我只想检查它们是否发生碰撞,然后将它们从视图和数组中删除。

是否正在寻找一种方法来查找同时位于两个不同数组中的对象

如果是这样,我建议使用
NSArray
索引ObjectsPassingTest:

@implementation NSArray (Comparison)
- (NSIndexSet *)indexesOfObjects:(NSArray *)objects {
    return [self indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
        return [objects containsObject:obj];
    }];
}
- (NSArray *)objectsCommonWithArray:(NSArray *)array {
    return [self objectsAtIndexes:[self indexesOfObjects:array]];
}
@end
然后你可以这样做:

// assuming array1 and array2 exist.
NSArray *commonObjects = [array2 objectsCommonWithArray:array2];

NSArray
s有一个
containsObject:
方法,可以用来代替内部循环。但将一个数组中的所有对象放入一个集合(
[NSSet setWithArray:
)并循环另一个数组,检查它们是否在集合中,可能会更快(有人应该进行基准测试并查看)。或者将两者转换并使用
intersectSet:
(在可变副本上)。我的猜测是,当数组变大时,set方法会更快,但它不会对您拥有的数字产生影响

您可以使用


你在你的问题中使用了
collide
这个词,但没有告诉我们你的意思-这就是为什么到目前为止其他答案没有帮助:)他们说的是“字典/数组中的重复项”中的collide,但你指的是屏幕上覆盖的
中的collide

这可能是做这个测试最糟糕的方法——当你得到很多图像时,它会很快变得太慢。我忍不住想,你在试图解决一个比我们都聪明得多的人已经解决的问题-你到底想做什么-也许一个完整的物理引擎可能是实现你最终目标的更好方式

例如,看看-这将创建一个包含所有对象的树-不在树的相同叶子中的对象不会碰撞,因此可以快速减少比较。但是,该链接中的一些图表比我在这里能更好地解释原理:)

如果还没有,您可以尝试以下方法来优化内部循环:

// Compare each image with the others to see if they overlap
NSMutableSet *colliding = [NSMutableSet new];
for (NSInteger indexA = 0; indexA < myImages.count; ++indexA) {
    UIView *a = [myImages objectAtIndex:indexA];
    CGRect rectA = a.frame;

    for (NSInteger indexB = indexA; indexB < myImages.count; ++indexB) {
        UIView *b = [myImages objectAtIndex:indexB];
        if (a==b) continue;

        CGRect rectB = b.frame;
        CGRect intersection = CGRectIntersect(rectA, rectB);
        if (NO == CGRectIsNull(intersection)) {
            [colliding addObject:a];
            [colliding addObject:b];
        }
    }
}

// Remove the colliding images
for (UIView *c in colliding) {
    [c removeFromSuperview];
    [myImages removeObject:c];
}
//将每个图像与其他图像进行比较,看看它们是否重叠
NSMutableSet*冲突=[NSMutableSet new];
对于(NSInteger indexA=0;indexA
是否要从阵列中删除重复的项目?问题不清楚,请尝试重新措辞。当您说“碰撞”时,您指的是阵列中的项目在物理空间中有位置的游戏吗?还是地图上的点?或者相同的项目(即重复项)?这是一款在NSMutableArray中包含UIImageViews的游戏,我只想检查它们何时发生碰撞。请您解释一下“碰撞”的含义。如果我的问题不清楚,我很抱歉。我在一个数组中有几个UIImageView。我只是想找到一种方法来检查它们何时相互碰撞。再次,请定义“碰撞”。我所说的碰撞是指数组中两个或多个对象的CGRect接触。我认为您要查找的动词是相交或重叠。CGRectContainsRect对于碰撞检测不正确,必须使用CGRECTCROSSION。此外,内部循环必须从外部循环当前迭代步骤旁边的视图开始。哦,你完全正确-我已经更改了答案,谢谢!谢谢,我不知道碰撞还有别的意思。我做的和你贴的很相似。这不是一个很好的方法,特别是如果你想同时检查两个以上的十字路口,你有很多像我一样的观点。如果我找不到更好的方法,我会坚持使用cocos2d及其物理引擎。顺便说一句,对计算机科学家来说,碰撞意味着:)
// Compare each image with the others to see if they overlap
NSMutableSet *colliding = [NSMutableSet new];
for (NSInteger indexA = 0; indexA < myImages.count; ++indexA) {
    UIView *a = [myImages objectAtIndex:indexA];
    CGRect rectA = a.frame;

    for (NSInteger indexB = indexA; indexB < myImages.count; ++indexB) {
        UIView *b = [myImages objectAtIndex:indexB];
        if (a==b) continue;

        CGRect rectB = b.frame;
        CGRect intersection = CGRectIntersect(rectA, rectB);
        if (NO == CGRectIsNull(intersection)) {
            [colliding addObject:a];
            [colliding addObject:b];
        }
    }
}

// Remove the colliding images
for (UIView *c in colliding) {
    [c removeFromSuperview];
    [myImages removeObject:c];
}