如何以逐渐增加的速度以随机顺序添加和动画来自屏幕底部的无限数量的对象?

How do I add and animate infinite number of objects coming from the bottom of the screen in random order in gradually increasing speeds?

我有 3 个不同的精灵。我想连续设置这三个从屏幕底部进入的不同精灵的动画,随着进入的对象数量的增加而增加速度。另外,这三个应该是随机的。

所以,我尝试了以下代码让三个精灵中的任何一个以任意顺序出现,但它没有按预期工作:

整数随机数;

for (int i = 1; i<500; i++) {
    randomNumber = arc4random_uniform(3);
    NSLog(@"Value of random Number %d" ,randomNumber);

if (randomNumber == 0) {
        [self addRedBall];
        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:5];

    dispatch_queue_t actionDispatchRed;

    actionDispatchRed = dispatch_queue_create("com.redball.dispatch", NULL);

    dispatch_async(actionDispatchRed, ^ {   [redBall runAction:moveBall];   });
    [NSThread sleepForTimeInterval:2];   //Time interval to wait before the next ball comes in.

    }

else if (randomNumber == 1) {
        [self addBlueBall];

        dispatch_queue_t actionDispatchBlue;

        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:5];
        actionDispatchBlue = dispatch_queue_create("com.blueball.dispatch", NULL);

        dispatch_async(actionDispatchBlue, ^{  [blueBall runAction:moveBall];  });
        [NSThread sleepForTimeInterval:2];


    }
else if (randomNumber == 2) {
        [self addGreenBall];
        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:5
                              ];
        dispatch_queue_t actionDispatchGreen;
        actionDispatchGreen = dispatch_queue_create("com.greenball.dispatch", NULL);

        dispatch_async(actionDispatchGreen,
                       ^ {  [greenBall runAction:moveBall]; } );

    [NSThread sleepForTimeInterval:2];

    }


}

当我使用 [NSThread sleepForTimeInterval:2] 时; , 程序不会超出起始屏幕。

当我尝试 运行 没有 sleepForTimeInterval 的程序时,大量精灵进入并相互重叠,导致只有一个可见精灵。

请帮忙。

我不推荐使用 [NSThread sleepForTimeInterval:2];

尝试使用 [self performSelector:@selector(addBall) withObject:nil afterDelay:2];

-(void)addBall
{
    self.addedBall++;
    if (self.addedBall > 500)
    {
        return;
    }

    randomNumber = arc4random_uniform(3);

    if (randomNumber == 0) {
        [self addRedBall];
        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:5];

        dispatch_queue_t actionDispatchRed;

        actionDispatchRed = dispatch_queue_create("com.redball.dispatch", NULL);

        dispatch_async(actionDispatchRed, ^ {   [redBall runAction:moveBall];   });

        [self performSelector:@selector(addBall) withObject:nil afterDelay:2];
    }
    //other else if stuff

}

我也不确定为什么你是 运行 你的 SKActions 在 dispatch_queue 并且可能不需要。

希望对您有所帮助。