NSTimer即刻开火

时间:2011-12-19 21:23:33

标签: iphone objective-c nstimer

我正在尝试使用NSTimer开发游戏并遇到一个小问题,一旦精灵出现,它在我的场景中有一定的时间在淡出之前。

double CALC_TIME = 5;
[NSTimer scheduledTimerWithTimeInterval:CALC_TIME target:self selector:@selector(hideSprite) userInfo:nil repeats:NO];

我想在5秒后调用hideSprite,而是立即调用(或接近即时)。

可能的解决方案: 我知道我可以通过设置重复计时器来做到这一点,并且首先设置bool firstCall然后在下一个时间间隔内完成淡入淡出,计时器无效但我认为这不是好习惯

像这样:

bool firstCall = false;
-(void)hideSprite{
        if(!firstCall){
        firstCall = true
    }else{
        //fade out sprite
        //Invalidate NSTimer
        //firstCall = false;
    }
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我怀疑其他人正在调用hideSprite。您编写的代码导致计时器在调用选择器hideSprite之前等待五秒钟。

为计时器提供一个不同的选择器(编写一个只执行NSLog的新测试方法),看看会发生什么。这将告诉你a)计时器是否确实立即开火,b)如果其他人正在调用hideSprite

[NSTimer scheduledTimerWithTimeInterval:CALC_TIME target:self selector:@selector(testTimer) userInfo:nil repeats:NO];

-(void) testTimer { NSLog(@"Timer - and only the timer - called me."); }
-(void) hideSprite {
    NSLog(@"I definitely wasn't called by the timer.");
}

答案 1 :(得分:1)

通常使用像

这样的东西更容易
[UIView animateWithDuration: 0 delay: 5 options:0 animations: nil completion:
^{
  // fade sprite
}];

(不确定animations是否可以为零,但你明白了。)

答案 2 :(得分:0)

考虑使用initWithFireDate:interval:target:selector:userInfo:repeats方法初始化您的计时器。以下是NSTimer的详细介绍。