SKAction: как генерировать случайную задержку генерации узлов

Я использую следующий фрагмент кода для периодической генерации SKNodes. Есть ли способ сделать период генерации этих SKNodes случайным. В частности, как сделать «delayFish» в следующем коде действием со случайной задержкой?

[self removeActionForKey:@"fishSpawn"];
SKAction* spawnFish = [SKAction performSelector:@selector(spawnLittleFishes) onTarget:self];
SKAction* delayFish = [SKAction waitForDuration:3.0/_moving.speed];
SKAction* spawnThenDelayFish = [SKAction sequence:@[spawnFish, delayFish]];
SKAction* spawnThenDelayFishForever = [SKAction repeatActionForever:spawnThenDelayFish];
[self runAction:spawnThenDelayFishForever withKey:@"fishSpawn"];

person RawMean    schedule 25.07.2014    source источник


Ответы (2)


Объект:

Сначала установите среднюю задержку и диапазон...

#define kAverageDelay    2.0
#define kDelayRange      1.0     // vary by plus or minus 0.5 seconds

а затем измените действие delayFish на это...

SKAction* delayFish = [SKAction waitForDuration:kAverageDelay withRange:kDelayRange];

Свифт:

Сначала установите среднюю задержку и диапазон...

let averageDelay:TimeInterval = 2.0
let delayRange:TimeInterval = 1.0     // vary by plus or minus 0.5 seconds

а затем измените действие delayFish на это...

let delayFish = SKAction.wait(forDuration:averageDelay, withRange:delayRange)
person 0x141E    schedule 25.07.2014
comment
Вы проверили это? Возможно, вам потребуется увеличить kDelayRange, чтобы заметить разницу. Из документации Apple: каждый раз, когда выполняется действие (waitForDuration:withRange), оно вычисляет новое случайное значение длительности. Длительность может изменяться в любом направлении не более чем на половину значения параметра durationRange. - person 0x141E; 25.07.2014
comment
Оно работает. Извините, я невнимательно прочитал и подумал, что вы предлагаете то же самое, что и Акаино. Спасибо большое. - person RawMean; 26.07.2014

Вставьте случайное число с плавающей запятой вместо фиксированного.

В вашем случае примерно так:

double value = ((double)arc4random() / ARC4RANDOM_MAX) 
   * (maxValue - minValue)
   + minValue;

SKAction* delayFish = [SKAction waitForDuration:value/_moving.speed];

Я понимаю. Это не сработает в вашем случае, так как repeatActionForever будет работать с последним созданным случайным значением. Навсегда. Может быть, попробуйте это вместо этого. Я не уверен, что это работает:

SKAction* delayFish = [SKAction waitForDuration: (((double)arc4random() / ARC4RANDOM_MAX) * (maxValue - minValue)+ minValue)/_moving.speed];

Однако я предлагаю сделать случайное значение собственным методом.

-(double) getRandomValue(){
    return (((double)arc4random() / ARC4RANDOM_MAX) * (maxValue - minValue)+ minValue);
}

РЕДАКТИРОВАТЬ:

Вот ссылка на похожую проблему. Может быть, это может помочь. Извиняюсь!

SKAction *randomXMovement = [SKAction runBlock:^(void){
    NSInteger xMovement = arc4random() % 20;
    NSInteger leftOrRight = arc4random() % 2;
    if (leftOrRight == 1) {
        xMovement *= -1;
    }
    SKAction *moveX = [SKAction moveByX:xMovement y:0 duration:1.0];
    [aSprite runAction:moveX];
}];

SKAction *wait = [SKAction waitForDuration:1.0];
SKAction *sequence = [SKAction sequence:@[randomXMovement, wait]];
SKAction *repeat = [SKAction repeatActionForever:sequence];
[aSprite runAction: repeat];

Источник: SKAction: как анимировать случайные повторяющиеся действия

person Akaino    schedule 25.07.2014
comment
спасибо, но этот код не делает временной интервал между порождением узлов (через spawnLittleFishes) случайным. Срок пока фиксированный. - person RawMean; 25.07.2014
comment
Нет. Это делает delayFisch действием со случайной задержкой. Как вы хотели :) Не могли бы вы показать весь метод, чтобы увидеть, как вы реализовали случайное значение? - person Akaino; 25.07.2014
comment
Еще раз спасибо, но ваш второй метод эквивалентен первому и имеет ту же проблему. проблема с этим подходом заключается в том, что действие delayFish создается один раз и с фиксированным значением. - person RawMean; 25.07.2014
comment
Ты прав. Я снова отредактировал. На SO была аналогичная проблема, так что это может вам помочь! - person Akaino; 25.07.2014