Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CGRectIntersectsRect冲突计数过多_Iphone_Objective C_Xcode - Fatal编程技术网

Iphone CGRectIntersectsRect冲突计数过多

Iphone CGRectIntersectsRect冲突计数过多,iphone,objective-c,xcode,Iphone,Objective C,Xcode,我有一个像“雨”一样的动画从屏幕的顶部移动到底部(几个图像不断从顶部掉落)。我还有一个篮子图像,它由底部的手指控制。我想让应用程序计算任何掉落的图像和篮子之间的“碰撞”数量,如果它们发生碰撞,则移除图像 我使用了两个计时器:一个用来不断地从顶部投下图像。我把每一个图像都放在一个数组中。然后我有另一个计时器,每隔0.001,检查碰撞 每次两个物体碰撞时,我都能得到一个计数,但问题是,计数太多了!例如,每次视觉碰撞都会计算985次碰撞。我在代码中做错了什么 计时器: 碰撞检查器: - (void)o

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

我使用了两个计时器:一个用来不断地从顶部投下图像。我把每一个图像都放在一个数组中。然后我有另一个计时器,每隔0.001,检查碰撞

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

碰撞检查器:

- (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];
        }
    }
}
-(无效)onCollisionCheckTimer{

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

其次,视图即使从superview中删除后仍保留其图层属性。因此,可能发生的情况是,即使从superview中删除了坠落物体,您仍在
appleView
集合中对其进行迭代,并且它们的属性仍然与篮状视图相交。


解决此问题的一种方法是在检查碰撞之前检查每个apple视图的
superview
属性。只有当它不为零时,您才需要进行碰撞测试。

或在每个apple视图落在篮中后将其从
appleView
数组中删除。此外,使用
CADisplayLink
代替
NSTimer
CADisplayLink
与显示刷新计时器同步,这也是驱动核心动画更新的原因。如何执行superview属性检查?
if(appleView[x].superview!=nil)//视图具有superview
- (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];
        }
    }
}