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"];
2 ответа
ObjC:
Сначала установите среднюю задержку и диапазон...
#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)
Вставьте случайное плавание вместо фиксированного.
В вашем случае что-то вроде этого:
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: Как оживить случайные повторяющиеся действия