您的位置:首页 > 移动开发 > Cocos引擎

Cocos2D-X开发学习笔记2:定时器

2016-12-07 22:54 281 查看
在上节对加速度传感器的学习中,发现在实际应用中,需要设定一段时间间隔,记录开始和结束的加速度,来进行比较确定其变化。因此接下来将对定时器进行学习。

Cocos2D-X中提供了一个对象schedule,可以通过它来实现定时器的功能。

下面是一个简单的示例:

bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if (!Layer::init())
{
return false;
}

Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
screenWidth = visibleSize.width;
screenHeight = visibleSize.height;
scale = 1.0f;
label1 = Label::create("0,0,0","Arial",70);
label1->setPosition(screenWidth / 2, screenHeight / 2);
this->addChild(label1);

Device::setAccelerometerEnabled(true);
auto listener = EventListenerAcceleration::create(CC_CALLBACK_2(HelloWorld::onAcceleration, this)); //CC_CALLBACK的作用是让_target_对象用_selector_函数时绑定第0/1/2/3个参数后面参数的值
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

i = 5;
schedule(schedule_selector(HelloWorld::update),0.2f); //0.2用来设置每两次调用回调函数的时间间隔,第一个参数是回调函数。
CCLOG("update startted!");
return true;
}

void HelloWorld::update(float dt)
{
if (i > 0)
{
CCLOG("i = %d ",i);
i--;
}
else
{
unschedule(schedule_selector(HelloWorld::update)); //取消定时器
CCLOG("update ended!");
schedule(schedule_selector(HelloWorld::update_1), 0.2f); //注册新的定时器
CCLOG("update_1 startted!");
}
}

void HelloWorld::update_1(float dt)
{

if (i < 5)
{
i++;
CCLOG("i = %d ", i);
}
else
{
unschedule(schedule_selector(HelloWorld::update_1)); //取消定时器
CCLOG("update_1 ended!");
}
}


计时器的注册与取消方法:

1、最简单的定义:使用scheduleUpdate()注册,然后重写update方法:virtual void update(float dt);即可,其中参数dt即时间间隔。取消时对应使用unscheduleUpdate()。

2、带参数的定义:schedule(schedule_selector(HelloWorld::update),0.2f),这样可以直接更改时间间隔dt值。使用unschedule(schedule_selector(HelloWorld::update));取消。

需要注意的是注册和取消是对应的,可以使用unscheduleAllSelectors取消正在作用的所有定时器。

其运行效果如下,我注册了两个定时器,update计时5次后取消并注册update_1,然后update_1计时5次后取消。



在书中看到,在实际应用中,可以同时注册多个定时器来进行多线程操作,能够想象但是难度有点大,就不去试了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: