cocos2dx 有三种时间调度,
scheduleUpdate 需要玩家重载当前的update函数,每一帧都会调用一次,但是调度的时间是不确定的,如果是60帧的,时间在0.017s左右,通过unschedulerUpdate()停止该调度器
schedule 自定义调度器 实现以一定的时间间隔连续调用某个函数,同时也可以指定调度多少次;调度的时间间隔必须大于两帧之间的最短事件(大于0.1s)
文档里面的参数:
我们来看下scheduler(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)函数里面的参数:
第一个参数selector即为你要添加的事件函数
第二个参数interval为事件触发时间间隔
第三个参数repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数
第四个参数delay表示第一次触发之前的延时
scheduleOnce 单次调度器 只会调度一次,另外在调度的过程中(调度器执行过程)不能再次使用单次调度器,否则新的调度器不会执行(可能和锁有关?没看过代码。。。)
自定义调度器和单次调度器都通过unschedule(SEL_SCHEDULE selector, float delay)来取消该触发器
简单的使用例子
this->schedule(schedule_selector(HelloWorld::test), 2);
void HelloWorld::test(float dt)
{
//auto rootNode = getChildByName("main");
//DisplayCircle* displayCircle = static_cast<DisplayCircle *>(rootNode->getChildByName("DisplayCircle"));
//displayCircle->setPos(Point(200, 200));
//DisplayCircle* displayCircle = static_cast<DisplayCircle *>(rootNode->getChildByName("circle_1"));
//deleteCircle(displayCircle);
int y = random(0, 480);
if (monsterProducer->monster_list.size() == 0) {
monsterProducer->produce(Vec2(960,y),20);
return;
}
else {
int flag = random(0, 1);
if (flag) {
monsterProducer->produce(Vec2(960, y), 20);
}
else {
int which = random(0, int(monsterProducer->monster_list.size() - 1));
Monster *temp = monsterProducer->monster_list.at(which);
monsterProducer->die(temp);
}
}
}
this->scheduleUpdate();
void HelloWorld::update(float dt)
{
CCLOG("update");
auto rootNode = getChildByName("main");
//auto monster=static_cast<Monster* >(rootNode->getChildByName("monster"));
//monster->run(dt);
monsterProducer->runAll(dt);
}