Cocos2d-x学习(4) - cocos2d-x中的定时器

来源:互联网 发布:雅思培训网络课程 编辑:程序博客网 时间:2024/06/05 13:29

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);}

运行结果:

Alt text

Alt text

0 0