Проблема с действием CGRectIntersectsRect - PullRequest
0 голосов
/ 01 мая 2011

.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 Ответ

3 голосов
/ 01 мая 2011

Несколько вопросов:

  1. CGRectIntersectsRect() возвращает YES, потому что вы сравниваете границы ваших объектов, а не фреймов. Границы объекта - это прямоугольник, описывающий, как объект видит свои собственные измерения. Обычно он начинается с (0,0), а размер - это размер представления. Поскольку оба вида имеют границы, начинающиеся с (0,0), прямоугольники границ do пересекаются.

    Что вам действительно нужно, так это рамка просмотров. Кадр представления представляет пространство, занимаемое в этом представлении, относительно его суперпредставления. То есть:

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

    Рамка представляет местоположение вида. Границы представляют расположение содержимого в самом представлении. Когда вы сравниваете положение двух видов, вы почти всегда хотите использовать фрейм.

  2. Как написано в настоящее время, ваш код будет добавлять новое подпредставление каждый раз, когда происходит пересечение, но никогда не удалит старое подпредставление. Поскольку акселерометр может срабатывать несколько раз в секунду, это может привести к добавлению множества представлений в иерархию представлений. Это может существенно повлиять на производительность, и, возможно, именно поэтому вы видите такую ​​низкую производительность. Вместо этого я бы порекомендовал создать одну UIImageView в качестве переменной экземпляра, а затем использовать свойство hidden, чтобы контролировать, является ли он видимым или нет.

Таким образом, я бы порекомендовал вам изменить код следующим образом:

if (CGRectIntersectsRect(ball.frame, fang.frame)) {
    guyView.hidden = NO;
}
else {
    guyView.hidden = YES;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...