我使用别人的代码在SpriteKit中编写一个计时器,并稍微调整一下.这是我的代码的样子:
- (void)createTimerWithDuration:(NSInteger)seconds position:(CGPoint)position andSize:(CGFloat)size
{
// Allocate/initialize the label node.
_countdownClock = [SKLabelNode labelNodeWithFontNamed:@"Avenir-Black"];
_countdownClock.fontColor = [SKColor blackColor];
_countdownClock.position = position;
_countdownClock.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
_countdownClock.fontSize = size;
[self addChild:_countdownClock];
// Initialize the countdown variable.
_countdown = seconds;
// Define the actions.
SKAction *updateLabel = [SKAction runBlock:^{
_countdownClock.text = [NSString stringWithFormat:@"Time Left: 0:%lu", (unsigned long)_countdown];
_countdown--;
}];
SKAction *wait = [SKAction waitForDuration:1.0];
// Create a combined action.
SKAction *updateLabelAndWait = [SKAction sequence:@[updateLabel, wait]];
// Run action "seconds" number of times and then set the label to indicate the countdown has ended.
[self runAction:[SKAction repeatAction:updateLabelAndWait count:seconds] completion:^{
_countdownClock.text = @"GAME OVER!";
_gameOver = YES;
[self runAction:_gameOverSound];
}];
}
我想要发生的是,当某个代码块运行时(我自己负责),我想给计时器增加10秒.
我已经尝试过,通过添加一个名为_countTime的常量实例变量来保持最初的60秒.在-init方法中,我调用[self createTimerWithDuration:_countTime position:_centerOfScreen andSize:24];在这个函数中,每次“秒”减少时我都会减少_countTime – 换句话说,每秒,_countTime都会减少.当我运行块时,块添加10秒的时间,我将删除_countdownClock,向_countTime添加10秒,最后再次调用createTimerWithDuration:position:andSize:with update _countTime.
但这似乎对我不起作用.我认为它会运作得相当好.它确实增加了10秒的时间,就像我想要的那样,但计时器将开始下降三分之一.它会等一下,然后15-14-12 BAM!然后等一下,然后11-10-9 BAM!等等.
那么这里发生了什么?这是正确的方法吗?有没有更好的方法让我增加时间,或者(更好的是!)更好的方法来创建一个具有这样功能的计时器?
最佳答案 我相信这个问题是因为你正在对“自我”进行操作.你的旧动作没有被移除,它仍然每秒消除时间.试试这个…
[_countdownClock runAction:[SKAction repeatAction:updateLabelAndWait count:seconds] completion:^{
_countdownClock.text = @"GAME OVER!";
_gameOver = YES;
[self runAction:_gameOverSound];
}];
and finally call createTimerWithDuration:position:andSize:
我假设你在再次调用之前删除了旧标签,否则你会得到一些非常奇怪的文字.当您从其父级删除_countdownClock时,它也应该删除该操作,它不会继续减少时间并应该解决您的问题.
希望这会有所帮助.