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

前端之家收集整理的这篇文章主要介绍了Cocos2d-x学习(4) - cocos2d-x中的定时器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

运行结果:

猜你在找的Cocos2d-x相关文章