Создание границы для объектов

#ios #objective-c

#iOS #objective-c

Вопрос:

Я довольно новичок в программировании на objective-c и iOS в Xcode, и при создании своего первого приложения я столкнулся с проблемой создания барьеров по краю экрана, через которые объект не может пройти. Я попытался разместить объекты на границе и использовать CGRectIntersectsRect, но столкновение между границей и основным объектом не зарегистрировано. Кто-нибудь знает, как я буду это делать?

это код, который я использовал для перемещения объекта:

 const float rate= 0.025;
NSTimer *goLeft;
NSTimer *goRight;

- (IBAction)right {

    goRight=[NSTimer scheduledTimerWithTimeInterval:rate
                                            target:self
                                          selector:@selector(goRight)
                                          userInfo:nil
                                           repeats:YES];
    if (goRight == nil){
        goRight=[NSTimer scheduledTimerWithTimeInterval:rate target:self selector:@selector(goRight) userInfo:nil repeats:YES];
    }




}



- (IBAction)left{


    goLeft=[NSTimer scheduledTimerWithTimeInterval:rate
                                           target:self
                                         selector:@selector(goLeft)
                                         userInfo:nil
                                          repeats:YES];
    if (goLeft == nil){
        goLeft=[NSTimer scheduledTimerWithTimeInterval:rate target:self selector:@selector(goLeft) userInfo:nil repeats:YES];
    }


}

-(IBAction)stopLeft{
    [goLeft invalidate];
    goLeft=nil;
}


-(IBAction)stopRight{
    [goRight invalidate];
    goRight=nil;
}

-(void)goLeft{
    _userToken.center =CGPointMake(_userToken.center.x -20, _userToken.center.y);
}

-(void)goRight{
    _userToken.center =CGPointMake(_userToken.center.x  20, _userToken.center.y);

}
  

И для столкновения с объектом на левой границе (UserToken и friendly являются UIImageView). Однако, когда они сталкиваются, NSLog не выполняется.

  -(void)checkForCollision{
        if (CGRectIntersectsRect(_userToken.frame, _friendly.frame)){
            NSLog(@"Left Intersect");

        }
    }
  

Комментарии:

1. Дайте больше контекста о том, что представляют собой ваши объекты и как они перемещаются. Покажите код, который вы пробовали до сих пор.

2. В вопрос добавлен код

Ответ №1:

Вы не говорите, что _userToken.frame и _friendly.frame устанавливаются при тестировании — рекомендуется регистрировать их во время тестирования, чтобы вы могли проверить вручную.

Альтернативный подход, если допустимая область экрана является прямоугольником, заключается в проверке пересечения токена и допустимой области и проверке того, что она равна фрейму токена:

 if (CGRectEqualToRect(CGRectIntersection(_userToken.frame, validFrame), _userToken.frame)) { ...
  

При проверке любым методом важно, чтобы фреймы находились в одном и том же пространстве координат (чтобы представления имели одинаковый супервизор или чтобы вы преобразовывали их в один и тот же общий супервизор) — опять же, ведение журнала поможет вам проверить это.

В сторону:

Попытка воссоздать таймер, если он просто не удался, вряд ли поможет. И вы действительно должны проверить наличие существующего таймера и аннулировать его перед созданием нового таймера (в противном случае у вас может быть запущено несколько таймеров, и их невозможно остановить).

Комментарии:

1. Часть столкновения сработала отлично, но как мне остановить запуск нескольких таймеров?

2. Вы можете останавливать только те таймеры, на которые у вас есть ссылка, поэтому, если вы потеряете эту ссылку, вы не сможете ее остановить.