#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. Вы можете останавливать только те таймеры, на которые у вас есть ссылка, поэтому, если вы потеряете эту ссылку, вы не сможете ее остановить.