performSelector:@selector()没有按预期工作?

时间:2015-03-01 16:35:09

标签: ios objective-c sprite-kit

我用精灵套装制作了一个游戏,其中球从底部射出。我为每个场景制作了不同的Xcode项目,然后我将它们全部编译成一个。它们的编译没有任何错误,但场景没有按预期运行。

在不同的项目中,无限的球从底部出现,但是当我运行编译的项目时,只有一个球来了。我在addBall中致电didMoveToView

-(void)addBall {

    int randomNumber = arc4random_uniform(5);

    if (randomNumber == 0) {
        [self addRedBall];

        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:durationTimeMED];
        [redBall runAction:moveBall];

        [self performSelector:@selector(addBall) withObject:nil afterDelay:t];
    }

    else if (randomNumber == 1) {
        [self addBlueBall];
        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:durationTimeMED];
        [blueBall runAction:moveBall];

        [self performSelector:@selector(addBall) withObject:nil afterDelay:t];

    }

    else if (randomNumber == 2) {
        [self addGreenBall];
        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:durationTimeMED];
        [greenBall runAction:moveBall];

        [self performSelector:@selector(addBall) withObject:nil afterDelay:t];
    }

    else if (randomNumber == 3) {
        [self addCyanBall];
        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:durationTimeMED];
        [cyanBall runAction:moveBall];

        [self performSelector:@selector(addBall) withObject:nil afterDelay:t];
    }

    else if (randomNumber == 4) {
        [self addYellowBall];
        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:durationTimeMED];
        [yellowBall runAction:moveBall];

        [self performSelector:@selector(addBall) withObject:nil afterDelay:t];
    }
}

performSelector是不是应该无限次地运行? 有什么我做错了吗?或者有什么我想念的东西?

更新:我在@implementation之后和任何方法之前声明变量。 我在同一区域宣布这样的球(所有颜色):

SKSpriteNode *yellowBall;  

然后在各自的方法中设置所有各自的属性 t是NSTimeInterval类型变量,我在同一区域中声明如下:

NSTimeInterval t;

2 个答案:

答案 0 :(得分:0)

所以你想让addBall重复调用自己?然后4次中有1次会加一个球?

你需要在if语句之外移动调用performSelector:withOBject:afterDelay。

你写它的方式,如果randomNumber == 0,它只会再次调用自己。在所有其他情况下,它会停止。所以你的赔率是1:4再次召唤自己一次。赔率是1:16再次召唤自己两次,并且1:64再次召唤自己3次。

答案 1 :(得分:0)

详细说明我的评论:

如果它按照您的意图运行,一旦您启动-addBall操作,您就永远无法停止递归调用。

更好的方法是拥有实例变量,例如NSTimer* addBallTimer并将其用于重复调用-addBall

当你想开始添加球时:

addRedTimer = [NSTimer scheduledTimerWithTimeInterval:delayTimeM 
                                               target:self 
                                             selector:@selector(addBall)
                                             userInfo:nil
                                              repeats:YES];

-addBall

中移除递归
-(void)addBall {

    int randomNumber = arc4random_uniform(4);

    if (randomNumber == 0) {
        [self addRedBall];

        SKAction *moveBall = [SKAction moveToY:CGRectGetMaxY(self.frame) duration:durationTimeM];
        [redBall runAction:moveBall];
    } 
}  

通过这种方式,您可以使用[addBalTimer invalidate];

取消操作