CGRectIntersectsRect冲突计数太多

时间:2012-12-01 03:55:55

标签: iphone objective-c xcode

我有一个“雨”,就像动画从屏幕顶部移动到底部(几个图像从顶部不断下降)。我还有一个由手指在底部控制的篮子图像。我希望应用程序计算任何丢弃图像和篮子之间的“碰撞”数量,如果它们发生碰撞则删除图像。

我使用两个计时器:一个用于从顶部连续丢弃图像。我将每个图像放在一个数组中。然后我有另一个计时器,每0.001,检查一次碰撞。

每次两个物体发生碰撞时我都能得到一个计数,但问题是,它的计算方式太多了!例如,每次视觉碰撞都会计算985次碰撞。我的代码中我做错了什么?: 计时器:

[NSTimer scheduledTimerWithTimeInterval:(0.001) target:self selector:@selector(onCollisionCheckTimer) userInfo:nil repeats:YES];

碰撞检查:

- (void)onCollisionCheckTimer{
    for (x = 0; x<100; x++){
        CALayer *layer = appleView[x].layer.presentationLayer;
        if(CGRectIntersectsRect(basketView.frame, layer.frame)) {
            collision++;
            printf("%i\n", collision);
            [appleView[x] removeFromSuperview];
        }
    }
}

printf("%i", collision);正在为每次碰撞输出数百个数字

1 个答案:

答案 0 :(得分:1)

首先,您的碰撞测试计时器持续时间太短。实际上,主运行循环每秒只运行约60次,因此您应该使用接近0.016的持续时间。你永远不会得到一个计划的计时器来触发每毫秒。

其次,即使从超级视图中删除,视图也会保留其图层属性。所以可能发生的事情是,即使从superview中删除掉落的对象,你仍然在appleView集合中迭代它们,并且它们的属性仍然与篮子视图相交。

解决此问题的一种方法是在检查冲突之前检查每个苹果视图的superview属性。只有当它是非零时才需要进行碰撞测试。