CGRectIntersectsRect并不总是检测冲突

时间:2012-11-29 20:07:17

标签: iphone objective-c

我创建了一个应用程序,图像从天而降,我必须用一个用户可移动的篮子“抓住”它们。我将下降的图像和篮子图像放在CGRectMake帧中,并使用CGRectIntersectsRect来检测碰撞。但是,它没有检测到每次碰撞。例如,我会在视觉上“抓住”10个物体,两个帧肯定相交,但它只会说我抓到了2.我做错了什么?

以下是存储桶的代码:

  • (无效)viewDidLoad中 {     [super viewDidLoad];

    basketView = [[UIImageView alloc]
                  initWithImage:[UIImage imageNamed:@"bucket.png"]];
    basketView.frame = CGRectMake(130.0, 412.0, 30.0, 30.0);
    [self.view addSubview:basketView];
    

    }

这是坠落的物体和碰撞代码:

- (void)onTimer
{
    UIImageView* appleView = [[UIImageView alloc] initWithImage:appleImage];


    int applePosition = round(random() % 320); //random starting x coord
    double scale = 1 / round(random() % 100) + 1.0; //random apple size
    double speed = 1 / round(random() % 100) + 1.0; //random apple speed


    appleView.frame = CGRectMake(applePosition, -100.0, 25.0 * scale, 25.0 * scale);

    [self.view addSubview:appleView];

    [UIView beginAnimations:nil context:(__bridge void *)(appleView)];
    [UIView setAnimationDuration:3 * speed];


    appleView.frame = CGRectMake(applePosition, 500.0, 25.0 * scale, 25.0 * scale); 


    // Test for landing in bucket
    if (CGRectIntersectsRect(basketView.frame, appleView.frame)) {
        collision++;
        printf("%i\n", collision);
        [appleView removeFromSuperview];
    }
}

编辑:我把篮子弄得很大,现在我收到了垃圾邮件,没有苹果出现。所以我假设它只是在它的起始点检查与苹果的交集,而不是在实际动画期间。如何在动画中检查交叉点?

1 个答案:

答案 0 :(得分:1)

显然,如果你的计时器函数产生了新的对象,那么测试将在创建对象之后完成,所以如果对象实际上没有在篮子中创建,那么你的命中测试将始终为负。

现在,您需要另一个计时器,它将每十分钟左右测试一次碰撞(取决于您移动物体的速度,这可能或多或少)。一个更好的选择(从性能的角度来看)是使用CADisplayLink,其工作方式与计时器非常相似,只允许您将测试与显示器的刷新率同步。