0

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

我使用了两个计时器:一个用于不断地从顶部放下图像。我将这些图像中的每一个都放在一个数组中。然后我有另一个计时器,每 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);每次碰撞都会输出数百个数字

4

1 回答 1

1

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

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

One way to fix this would be to check the superview property of each apple view before you check for collisions. Only if it's non-nil do you need to do the collision test.

于 2012-12-01T04:04:56.567 回答