У меня есть такой код:

@implementation MyScene {
SKAction *delayAction; 
}
Inside a method:

delayAction = [SKAction waitForDuration:3.0];
[self runAction:[SKAction repeatActionForever: [SKAction sequence:
                                                @[delayAction, [SKAction ...]]]]]
                                                  withKey:@"myKey"];

Затем я хочу уменьшить продолжительность сверхурочной работы. (Этот метод вызывается при обновлении :) Итак, я попробовал:

    - (void)updateVelocity
{
    NSLog(@"duration:%f",delayAction.duration);
    delayAction.duration = delayAction.duration - 0.001;
}

И я получаю:

2014-04-04 11:45:05.781 FlyFish[5409:60b] duration:1.300000
2014-04-04 11:45:05.785 FlyFish[5409:60b] duration:1.299000
2014-04-04 11:45:05.800 FlyFish[5409:60b] duration:1.298000
2014-04-04 11:45:05.816 FlyFish[5409:60b] duration:1.297000

Что кажется хорошим, но мое [SKAction ...] продолжает повторяться через 3 секунды.

2
Godfather 4 Апр 2014 в 13:59

2 ответа

Лучший ответ

Я бы сделал это по-другому. Что-то вроде этого...

- (void)recursiveActionMethod
{
    if (some end condition is met) {
        return;
        // this allows you to stop the repeating action.
    }

    self.duration -= 0.01;
    // store duration in a property

    SKAction *waitAction = [SKAction waitForDuration:self.duration];
    SKAction *theAction = [SKAction doWhatYouWantHere];
    SKAction *recursiveAcion = [SKAction performSelector:@selector(recursiveActionMethod) onTarget:self];

    SKAction *sequence = [SKAction sequence:@[waitAction, theAction, recursiveAction]];
    [self runAction:sequence];
}

Это выполнит ваше действие, а затем вернется к этой функции для повторного запуска с другим ожиданием, снова и снова, и снова ...

Вы даже можете остановить последовательность, задав некоторое конечное условие, которое перескочит внутрь блока if и остановит цикл.

7
Fogmeister 4 Апр 2014 в 15:09
1
Хорошее решение. Во всяком случае, я решил с разной сетью. Я искал действие с помощью actionForKey:, а затем удалял его. После этого я запускаю его снова с diffenret waitForDuration.
 – 
Godfather
4 Апр 2014 в 17:13

Я немного опоздал, но вместо этого вы можете установить действие SKActionTimingEaseOut. Также это родной язык и должен работать немного быстрее. (Хотя вы не можете настроить изменения скорости) Это можно сделать аналогично этому:

  1. yourSKAction.timingMode = SKActionTimingEaseOut;
2
Elindor 6 Мар 2015 в 21:07