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];

Swift:

Първо задайте средно забавяне и обхват...

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
Работи. Съжалявам, че не прочетох внимателно и реших, че предлагате същото нещо, което направи Akaino. Благодаря много. - 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