2015-01-13 2 views
1

В моем текущем проекте есть две основные механики. Серия объектов, которые постоянно перемещаются вверх по экрану, и механика, где вы нажимаете несколько кнопок для перемещения 2 объектов. Для серии объектов, которые движутся по экрану, я использовал CADisplayLink, а для другого механика используется UIAnimation, однако, когда я запускаю свой проект, я замечаю, что UIAnimation препятствует перемещению объектов, связанных с CADisplayLink в течение секунды при каждом нажатии кнопки. Как исправить эту проблему?Как предотвратить UIAnimation от вмешательства в CADisplayLink

Ниже мой код для этих двух механиков

-(IBAction)tap{ 
    CGRect frame = Person.frame; 
    frame.origin.x = 16; 
    frame.origin.y = 37; 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.2]; 

    Person.frame = frame; 
    [UIView commitAnimations]; 
} 

-(IBAction)tap1{ 
    CGRect frame = Person.frame; 
    frame.origin.x = 241; 
    frame.origin.y = 37; 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.2]; 

    Person.frame = frame; 
    [UIView commitAnimations]; 
} 

-(IBAction)tapR1{ 
    CGRect frame = Person1.frame; 
    frame.origin.x = 302; 
    frame.origin.y = 37; 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.2]; 

    Person1.frame = frame; 
    [UIView commitAnimations]; 
} 

-(IBAction)tapR2{ 
    CGRect frame = Person1.frame; 
    frame.origin.x = 526; 
    frame.origin.y = 37; 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.2]; 

    Person1.frame = frame; 
    [UIView commitAnimations]; 
} 

-(void)GameOver{ 
} 

-(void)Score{ 
    ScoreNumber = ScoreNumber + 1; 
    ScoreLabel.text = [NSString stringWithFormat:@"%i", ScoreNumber]; 
} 

-(IBAction)StartGame:(id)sender{ 
    StartGame.hidden = YES; 
    Spike.hidden = NO; 
    Spike1.hidden = NO; 
    Spike2.hidden = YES; 
    SpikeR.hidden = NO; 
    SpikeR1.hidden = NO; 
    SpikeR2.hidden = NO; 
    circle.hidden = NO; 
    ScoreLabel.hidden = NO; 

    [self PlaceBars]; 
    [self PlaceBars1]; 

    Movement = [CADisplayLink displayLinkWithTarget:self selector:@selector(BarMoving)]; 
    [Movement addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
} 

-(void)BarMoving{ 
    Spike.center = CGPointMake(Spike.center.x, Spike.center.y - 5); 
    Spike1.center = CGPointMake(Spike1.center.x, Spike1.center.y - 5); 
    Spike2.center = CGPointMake(Spike1.center.x, Spike1.center.y - 5); 

    if (Spike2.center.y == -115) { 
     [self PlaceBars]; 
    } 

    SpikeR.center = CGPointMake(SpikeR.center.x, SpikeR.center.y - 5); 
    SpikeR1.center = CGPointMake(SpikeR1.center.x, SpikeR1.center.y - 5); 
    SpikeR2.center = CGPointMake(SpikeR2.center.x, SpikeR2.center.y - 5); 

    if (SpikeR2.center.y == -115) { 
     [self PlaceBars1]; 

    } 
} 
+0

Это не совсем понятно. Вы должны показать результат в каком-то изображении/gif/видео. PS отрегулируйте свой код, пожалуйста. –

ответ

0

Я Рекон использовать CADisplayLink для всех механизмов движения.

Однако делегируйте логику движения вашим объектам вместо того, чтобы иметь родительский объект, который управляет всеми движениями. Это образец, который вы увидите в Unity.

В вашем случае, когда обновления CADisplayLink обновляются, пройдите через объекты и вызовите метод update() для каждого из них. Этот метод обновления перемещает этот объект на 5 пунктов, например, что делает BarMoving(), в нормальном состоянии. При включенном состоянии он постепенно перемещается в [241, 37].

Когда пользователь удаляет объект, изменяет его состояние с нормального на резьбовое, задавая начальную скорость, алгоритмы положения, целевую точку и метод update(), упомянутые выше, будут обрабатывать движение крана.