1.Cocos2d-x定时器简介
Cocos2d-x中一共有三种定时器:
- 1、帧循环定时器
- 2、一次性定时器
- 3、自定义定时器
三种定时器中帧循环的实时性最高,帧循环定时器是在Cocos2d-x程序界面每帧图像显示时运行的定时器。帧循环定时器常常用于游戏中物体的碰撞检测。
一次性定时器比较好理解,就是定时完之后开始计时,到时间后运行时间处理函数。自定义定时器是用的最多的一种定时器,他可以根据我们自己的实际需要来设置成不同的工作模式。
2、帧循环定时器
使用方法:在init中使用帧循环定时器打开帧循环定时器,打开帧循环定时器的函数是:
scheduleUpdate(); //打开帧循环定时器,需要重载一个update()回调函数
帧循环定时器运行时,会在每一帧重绘的时候去调用一个名字为update的回调函数,所以在Layer类中需要重写update函数。
void update(float delta) override;
完成上述工作时候,在运行过程中就会在每一帧图像重绘的时候调用这个update函数了。有些时候可能还需要关闭帧循环定时器,这时候就需要使用一个函数:
unscheduleUpdate(); //停止帧循环定时器
该函数运行后,帧循环定时器就会被关闭,也就是说不会再去调用update回调函数。
的最多的一种定时器,他可以根据我们自己的实际需要来设置成不同的工作模式。
3、一次性定时器
一次性定时器就是在运行过程中只会调用依次回调函数的定时器。使用示例如下:
//一次性定时器,2s中后开始执行
scheduleOnce(schedule_selector(T03Schedual::mySchedual),2);
该函数有两个参数,第一个参数包装一个类的成员函数(这个成员函数就是回调函数),第二个参数表示在定时后的x s后执行回调函数。
4、自定义定时器
自定义定时器有三个重载的形式:
<1> schedule(schedule_selector(T03Schedual::mySchedual));
<2> schedule(schedule_selector(T03Schedual::mySchedual),2);
<3> schedule(schedule_selector(T03Schedual::mySchedual),2.0,10,2);
- <1>形式和帧循环定时器的作用相同,都是在每一帧图像重绘的时候调用回调函数。不同的是,因为自定义定时器的第一个参数包装的是一个类成员函数,所以该成员函数是自定义的名称。
- <2>在<1>的基础上添加了一个参数,该参数表示的是调用的时间间隔。
- <3>在<2>的基础上增加两个参数,依次表示,重复调用的次数(该次数+1),延时x s后开始定时。
5、定时器的使用
游戏动画的本质就是界面的重新绘制。使用定时器,在定时器中完成精灵的移动就可以完成动画的效果。代码涉及到 getChildByTag(),该函数的功能是从渲染树上获取Tag为固定值得精灵。下面代码实现使用定时器绘制在界面上左右移动的精灵,精灵的添加是在init函数中完成。
- (1)添加精灵
CCSprite *spr = CCSprite::create("woman.png");
spr->setScale(0.3);
CCSize sz = CCDirector::sharedDirector()->getWinSize();
spr->setPosition(ccp(100,sz.height / 2));
spr->setTag(100);
addChild(spr);
- (2)定时器完成精灵的移动
void T03Schedual::mySchedual(float dt)
{
CCSprite *spr = (CCSprite*)(getChildByTag(100));
float v = 300 / 2;
static bool flag = true; //向右走
if (flag)
{
spr->setPositionX(spr->getPositionX() + v*dt);
if (spr->getPositionX() >= 400)
flag = !flag;
}
else
{
spr->setPositionX(spr->getPositionX() - v*dt);
if (spr->getPositionX() <= 100)
flag = !flag;
}
//CCLog("Once Timer %g\n",dt);
}
运行结果: