0

我目前正在使用 NSTimer 作为记录时间的基础制作应用程序。但是,如果玩家在当前问题上使用了提示或弃权,我希望对正在进行的 NSTimer 增加时间进行惩罚。

我的问题是,是否可以为正在进行的 NSTimer 增加更多价值?例如,计时器在 0:23:41.2,用户按下提示/放弃。我想要一个添加功能,比如说 10 分钟。当玩家按下提示/没收时,如何制作一个功能,使计时器变为 0:33:41.2?

我尝试在谷歌和 SO 上查找与 NSTimer 相关的文章,并遇到了这个可能有用的 SO 线程。如何为 NSTimer 赋值

而不是线程中显示的经过时间,我想我可以用下面的变量交换它。(但如果我下面展示的例子不可行,请赐教,我真的很想让这个游戏成功)

-(BOOL)hintButtonPressed

.

-(void) timerFireMethod:(NSTimer *) theTimer {

        if (hintButtonPressed == true) {
            // do something to increase value
            [theTimer invalidate];
        } 
}
4

3 回答 3

2

NSTimer不是跟踪时间的好工具。它是调度周期性动作的好工具(尤其是对时间要求不高的动作)。

您跟踪时间的方式是使用三个 ivars:最近的“计时器开始”时间、“累积时间”(即最近开始之前的时间)和“isRunning”布尔值。在任何给定时间,总时间为:

accumulated + (now - start) * (isRunning ? 1 : 0)

有了这个,你可以很容易地通过修改来增加或减少时间accumulated。而且您不需要NSTimer更新数据(这很少是一个好方法)。

于 2012-10-18T16:31:14.890 回答
2

即使我不会使用 NSTimer 进行倒计时,也有一种简单的方法可以将时间添加到它的 fireDate:

[_timer setFireDate:[[_timer fireDate] dateByAddingTimeInterval:600]];

这会给我的 _timer 增加 10 分钟(600 秒)。

您的示例的最佳解决方案是为按钮创建一个动作方法并检查该动作方法是否用户已经获得了时间奖励。

当然,您可以在 fire 方法中修改 fireDate 但我的代码行不会再次触发。

于 2012-10-18T17:09:41.467 回答
1

据我所知,您不能添加、增加 NSTimer 的时间,您需要创建一个新的,并释放/使旧的无效。

顺便说一句,如果它是一个简单的计时器,你仍然可以让它变得简单

[NSObject cancelPreviousPerformRequestsWithTarget: self]
[self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay: incrementedTime];

但是你如果你执行Selector,你不能像NSTimer那样得到精确的时间信息,你只能盲目地增加时间。所以一切都取决于你的需求。

于 2012-10-18T16:31:16.680 回答