-(void) scheduleUpdates { [self scheduleUpdate]; } -(void) update:(ccTime)delta { // 此方法每一帧都会被调用 }
每秒执行10次
-(void) scheduleUpdates { [self schedule:@selector(updateTenTimesPerSecond:) interval:0.1f]; } -(void) updateTenTimesPerSecond:(ccTime)delta { // 此方法将根据时间间隔来调用,每秒10次 }
如果你想之后停止对某个指定更新方法的定时信息的话,上述代码更加合适。因为scheduleUpdate方法没有停止定时信息的功能。
以下代码会停止节点的所有选择器,包括那些已经在scheduleUpdate里面设置了预定的选择器:
[self unscheduleAllSelectors];
以下代码会停止某个指定的选择器(假设选择器名称是updateTenTimesPerSecond):
[self unschedule:@selector(updateTenTimesPerSecond:)];
预定的控制器只运行一次:
-(void) scheduleUpdates { [self schedule:@selector(tenMinutesElapsed:) interval:600]; } -(void) tenMinutesElapsed:(ccTime)delta { [self unschedule:_cmd]; }
_cmd关键词是当前方法的缩写。上述代码只会让tenMinutesElapsed方法运行一次。实际上你也可以用_cmd来设置方法调用的预定。假设你需要调用一个方法,这个方法会使用不同的时间间隔来调用,每次方法被调用以后,时间间隔都会发生变化。你的代码看起来会是像下面这样:
-(void) scheduleUpdates { // 像之前一样预定第一次更新 [self schedule:@selector(irregularUpdate:) interval:1]; } -(void) irregularUpdate:(ccTime)delta { // 首先,停止方法调用的预定 [self unschedule:_cmd]; // 这里我们用随机数来决定下次调用此方法需要经过的时间 float nextUpdate = CCRANDOM_0_1() * 10; // 然后用_cmd来代替选择器,用新的时间间隔来重新预定方法调用 [self schedule:_cmd interval:nextUpdate]; }
最后一个预定方法调用的问题是安排更新方法的优先次序。请先看一下以下代码:
// 在A节点里 -(void) scheduleUpdates { [self scheduleUpdate]; } // 在B节点里 -(void) scheduleUpdates { [self scheduleUpdateWithPriority:1]; } // 在C节点里 -(void) scheduleUpdates { [self scheduleUpdateWithPriority:-1]; }