测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最新发布 | 2015年4月 |
由 PJ Engineering and Business Solutions Pty. Ltd. 维护。
GameTimer 是一个轻量级的计时器,您可以用它来制作 iOS 游戏。它非常容易扩展以适应更复杂的项目。一个用途是在主计时器运行时更新进度条。
GameTimer 集成了两个协同工作的计时器,分别称为 longTimer 和 shortTimer。其中 shortTimer 作为分辨率更高的计时器,可用于更新进度条或持续轮询网络连接(例如)。其间隔通常是 longTimer 间隔的一个小分数。
当应用进入后台时,GameTimer 会自动暂停,当应用再次处于活跃状态时会“取消暂停”。
GameTimer 需要 ARC。
如果您想将整个项目转换为 ARC,请运行 Xcode 中的 Edit > Refactor > Convert to Objective-C ARC... 工具,并确保您想要使用 ARC 的所有文件都被选中。
stopTimer 方法必须在调用 startTimer 方法的同一线程中调用。
要将 GameTimer 安装到您的应用中,请将 GameTimer.h 和 GameTimer.m 文件拖到您的项目中。
添加
#import "GameTimer.h"
到任何将使用 GameTimer 的类的顶部(*.h 或 *.m)。
确保该类遵循 GameTimerDelegate 协议
修改 .h 文件
@interface ViewController : UIViewController <GameTimerDelegate>
实现协议方法,如
-(void)longTimerExpired: (GameTimer *)gameTimer
{
//Time is up
}
声明实例变量/属性
@property (strong, nonatomic) GameTimer *gameTimer;
在 viewDidLoad 等方法中初始化计时器
self.gameTimer = [[GameTimer alloc] initWithLongInterval:2*60 andShortInterval:5 andDelegate:self]; //2 minute timer with short intervals of 5 seconds
当您需要开始时启动计时器
[self.gameTimer startTimer];
如果需要,可以提前停止计时器
[self.gameTimer stopTimer];
分辨率更高的计时器持续时间。这必须小于 longInterval。否则,GameTimer 的行为不可预测。单位是秒。它可以是 0.1 毫秒那么小。
@property float shortInterval;
总体计时器持续时间。当此计时器到期时,GameTimer 将自动停用。它会自动清理停用 shortTimer 和 longTimer 后的内存。单位为秒。它可以短至 0.1 毫秒。
@property float longInterval;
自 GameTimer 启动以来的秒数,不包括应用进入后台状态时的时间。
@property (nonatomic, readonly) float time;
代理必须响应该 longTimerExpired: 方法。这是 强制性的。当 longTimer 到期时调用。
@property(nonatomic, weak) IBOutlet id <GameTimerDelegate> delegate;
此方法用于初始化 GameTimer。GameTimer 绝对不允许 使用 init 初始化:初始化 GameTimer 不会自动开始计时器。
示例
self.gameTimer = [[GameTimer alloc] initWithLongInterval:2*60 andShortInterval:0.5 andDelegate:self];
上面的示例将创建一个 longInterval 为 120 秒的 GameTimer。它将以每 0.5 秒触发一次的方式调用 shortTimerExpired: 方法。
始终将 GameTimer 分配给单例变量 一次(如在 viewDidLoad 方法中)。如果您需要更改设置,请先停止计时器,然后使用属性进行更改,例如:
[self.gameTimer stop];
self.gameTimer.longInterval = 3*60; //change settings
[self.gameTimer start]; //then start the timer
如果您需要释放 GameTimer,则首先停止 GameTimer。例如:
[self.gameTimer stop];
self.gameTimer = nil;
类初始化器。
- (id)initWithLongInterval:(float)longInterval andShortInterval: (float)shortInterval
andDelegate:(id <GameTimerDelegate>) delegate;
停止计时器。这 必须 从调用 startTimer 方法的同一线程中调用。
- (void) stopTimer;
重启计时器。
- (void) startTimer;
暂停计时器
-(void)pauseTime;
取消暂停计时器
-(void)unPauseTime;
此方法在 longTimer 到期时触发。GameTimer 在此点停止。您需要调用 startTimer 方法来重启计时器。代理实现此方法是 强制性的。
-(void)longTimerExpired: (GameTimer *)gameTimer;
当 shortTimer 到期时,此方法会触发。它将继续触发,直到 longTimer 到期,此时 GameTimer 将停止。代理实现此方法是 可选的。为了更新进度条,应实现并使用该方法,并配合 time 值和 longInterval 值。此方法不一定在精确时刻触发。仅用于更新、轮询等任务。
-(void)shortTimerExpired: (GameTimer *)gameTimer time: (float)time longInterval: (float)longInterval;
示例项目将演示如何使用类的基本功能。它将更新进度条。显然,它可以扩展到您的游戏引擎,比如。想象是关键。
警告:如果将新创建的游戏计时器引用更改为新 [GameTimer alloc] 新地址,则在重新分配合同时必须先调用 stopTimer 方法。这是因为 NSRunLoop 保留着强引用。
示例(正确的方法——尽管我建议永远不要重新分配合同时使用)
self.gameTimer = [[GameTimer alloc] initWithLongInterval:2*60 andShortInterval:0.5 andDelegate:self]; //First allocation
[self.gameTimer stop];
self.gameTimer = [[GameTimer alloc] initWithLongInterval:5 andShortInterval:2 andDelegate:self]; //Second NEW allocation
随时提出改进建议,分叉、报告错误或提出任何问题。
PJ 工程和商业解决方案有限公司 http://www.pjebs.com.au