我用精灵套装制作了一个游戏,其中球从底部射出。我为每个场景制作了不同的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;
答案 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];