CGRectIntersectsRect操作出现问题

时间:2011-05-01 05:39:18

标签: objective-c

.m:

-(void)accelerometer:(UIAccelerometer *)accelerometer
       didAccelerate:(UIAcceleration *)acceleration
{
    if(CGRectIntersectsRect(ball.bounds , fang.bounds))
    {
        UIImage *image = [UIImage imageNamed:@"guy.png"];
        UIImageView *imageview = [[UIImageView alloc] initWithImage:image];
        [self.view addSubView:imageview];
        [imageview release];
    }

    NSLog(@"x : %g", acceleration.x);
    NSLog(@"y : %g", acceleration.y);
    NSLog(@"z : %g", acceleration.z);

    delta.y = acceleration.y * 60;
    delta.x = acceleration.x * 60;

    ball.center = CGPointMake(ball.center.x + delta.x, ball.center.y + delta.y);

    // Right
    if(ball.center.x < 0) {
        ball.center = CGPointMake(320, ball.center.y);
    }

    // Left

    if(ball.center.x > 320) {
        ball.center = CGPointMake(0, ball.center.y);
    }

    // Top

    if(ball.center.y < 0) {
        ball.center = CGPointMake(ball.center.x, 460);
    }

    // Bottom
    if(ball.center.y > 460) {
        ball.center = CGPointMake(ball.center.x, 0);
    }
}

·H:

UIImageView *ball;

IBOutlet UIImageView *fang;

我的麻烦: 当我打开应用程序时,图像@“guy.png”显示自己没有任何触及牙齿的东西。我需要帮助。还是//“”**我的加速计是如此不稳定,几乎不能使用这个.m代码:

if(CGRectIntersectsRect(ball.bounds , fang.bounds))
{
    UIImage *image = [UIImage imageNamed:@"endScreenImage.png"];
    UIImageView *imageview = [[UIImageView alloc] initWithImage:image];
    [self.view addSubView:imageview];
    [imageview release];
}

请帮助

1 个答案:

答案 0 :(得分:3)

一些问题:

  1. CGRectIntersectsRect()正在返回YES,因为您正在比较对象的边界,而不是帧。对象的边界是描述对象如何看待自己的尺寸的矩形。它的起源通常为(0,0),大小是视图的大小。由于两个视图都有一个从(0,0)开始的边界,因此边界矩形相交。

    您真正想要的是视图的框架。视图的框架表示该视图中占据的空间,与其超视图相关。那就是:

    if (CGRectIntersectsRect(ball.frame, fang.frame)) { // etc. }

    框架代表视图的位置。边界表示视图本身内容的位置。当您比较两个视图的位置时,您几乎总是想要使用框架。

  2. 按照目前的说法,每次有交叉点时,您的代码都会添加一个新的子视图,但永远不会删除旧的子视图。由于加速计可以每秒多次触发,因此可能会导致很多视图被添加到视图层次结构中。这可能会对性能产生重大影响,也可能是您看到这种糟糕表现的原因。我建议改为创建一个UIImageView作为实例变量,然后使用hidden属性来控制它是否可见。

  3. 因此,我建议您按如下方式修改代码:

    if (CGRectIntersectsRect(ball.frame, fang.frame)) {
        guyView.hidden = NO;
    }
    else {
        guyView.hidden = YES;
    }