Изменить скорость работающего SKAction

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

@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 секунды.


person Godfather    schedule 04.04.2014    source источник


Ответы (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 и остановит цикл.

person Fogmeister    schedule 04.04.2014
comment
Хорошее решение. Во всяком случае, я решил с разной сетью. Я искал действие с помощью actionForKey:, а затем удалял его. После этого я запускаю его снова с diffenret waitForDuration. - person Godfather; 04.04.2014

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

  1. yourSKAction.timingMode = SKActionTimingEaseOut;
person Elindor    schedule 06.03.2015