在前两个教程中是不是都出现了update方法呢?那么这个方法的左右时什么呢?本节将会给大家介绍下cocos2dx update方法以及定时器的运用。
相信大家在一看是创建空工程的时候应该就已经接触到了吧,运行工程后在屏幕的左下角有一个不停变换的数字,就在实时刷新哦,有一个方法
pDirector->setDisplayStats(true);
pDirector->setAnimationInterval(1.0 / 60.0f);
设置刷新频率哦。
那么我们就来介绍下更新函数的种类:
一、scheduleUpdate()
scheduleUpdate()方法,默认执行的目标为update(float dt),默认无限循环,默认每一帧执行一次,默认无等待时间。
我们可以看一下主场景uodate的实现
//刷新游戏
void GameScene::update(float dt) {
//刷新玩家小球位置
auto max = userBallList.size() >= 4 ? 4 : userBallList.size();
for (unsigned int i = 0; i < max; i++) {
auto ball = userBallList.at(i);
if (!ball) {
continue;
}
ball->setPosition(360, 300 - 42 * i);
ball->setVisible(true);
}
//检测是否碰撞,如果碰撞,游戏结束
if (isBallCollision) {
//播放音效
GameMusic::playEffect("music/fail.wav");
circle->stopAction(rotate);
this->runAction(Sequence::create(
DelayTime::create(0.8f),
CallFunc::create(CC_CALLBACK_0(GameScene::createFailedLayer, this)),
NULL));
unscheduleUpdate();
}
if (!isBallCollision) {
if (userBallNum == 0) {
//播放音效
GameMusic::playEffect("music/win.wav");
this->runAction(Sequence::create(
DelayTime::create(0.5f),
CallFunc::create(CC_CALLBACK_0(GameScene::createSuccessLayer, this)),
NULL));
unscheduleUpdate();
}
}
}
使用方式在init中调用,那么update方法则每一帧执行一次哦,我们可以看到上面的方法中进行了胜利失败检测,当检测到胜利失败,显示胜利失败界面,当然已经显示胜利失败了,需要终止当前的定时器,那就使用它的一个对应方法unscheduleUpdate()来终止更新
this->scheduleUpdate();
二、schedule()
上面scheduleUpdate()方法每一帧执行一次,那么如果我们有其他的需求,但是不需要每一帧执行一次怎么办呢?
cocos2dx很贴心的给大家提供了schedule()的方式
使用方式和scheduleUpdate()相似啊,不过需要指定更新的目标咯
我们看一下使用方式
首先我们定义一个方法
void HelloWorld::test_schedule(float dt)
{
CCLOG("test schedule()");
}
然后通过schedule调用该方法
//每隔1.0f执行一次,不加时间默认每帧都执行哦
schedule(schedule_selector(HelloWorld::test_schedule), 1.0f);
同理也有对应的终止方法
unschedule(schedule_selector(HelloWorld::test_schedule));
三、scheduleOnce();
当然还有一些情况,我们需要且仅需要执行一次,这种方法当然可以使用Action的组合动作触发,那么有这样定时器么?
答案时肯定有的啊,cocos2dx同样给我们提供了一个方便的方法,那就是scheduleOnce(),执行且只执行一次。、
我们还是看上面的test_schedule方法,scheduleOnce的使用方式和schedule一样哦
this->scheduleOnce(schedule_selector(HelloWorld::test_schedule), 1.0f)
注意:不是每隔1.0f执行一次啦,这儿是1.0秒之后执行1次哦。
当有一些数据需要延迟处理的时候该定时器就实现它的作用啦。
定时器的作用很重要哦,大家可以去看一下相关的源码,了解如何实现的。