定时事件是游戏中必不可少的元素,cocos2d-x提供了比较完善的定时器功能,可以满足我们的很多需求
首先,先介绍一下schedule,我们可以简单的认为他是定时器,是单线程的定时器
下面开始我们的正文介绍
------------------------------------------------------------------------------
1:scheduleUpdate 和update
先上代码
首先在头文件里定义update(float t)这个函数
然后再.cpp里实现 ,在init()里调用这个函数 ------------- this->scheduleUpdate() 主要,这里不需要带参数
最后在 Init() 外 实现这个函数
void HelloWorld::update(float t){
CCLOG("update1");
CCLOG("update2");
}
运行后会发现,会一直打印 update1 update2
所以,其实scheduleUpdate()这个函数就是帧回调函数,因为我们的屏幕一直刷新,所以就会一直打印,一直到程序结束
-----------------------------------------------------------
2:上面的Update()函数,你也可以理解为是系统自带的帧回调函数,我们也可以自定义帧回调函数,舍弃系统函数
在.里 加入自定义函数 void MutUpdate(float fDelta);
然后,在.cpp里实现我们的函数(init()外)
void HelloWorld::MutUpdate(float fDelta){
CCLOG("mutUpdate");
}
当然,我们要调用这个函数,这里是重点
/**指定每帧执行自定义的函数*/
this->schedule(schedule_selector(HelloWorld::MutUpdate));
这样呢,我们就会调用我们自定义的回调函数,系统会一直打印 mutUpdate
-----------------------------------------------------------------
3:上面说了我们自定义的回调函数,但严格意义上,不能称之为定时器,显然,定时器的时间都是一定的,即每经历多少时间回调此函数,所以,我们可以对上述函数加以完善
头文件不变,.cpp里对原语句进行修改,在后面加上一定时间
/**指定每帧执行自定义的函数,指定每隔N秒执行一次*/
this->schedule(schedule_selector(HelloWorld::MutUpdate),3.0f);//3.0f是我们的回调时间
然后,在函数实现里打印时间
CCLOG("MutUpdate fDelta = %f",fDelta);
(float fDelta是MutUpdate 离上一次被调用的时间间隔
----------------------------------------------------------------
4:cocos2d-x在指定回调函数时都使用*selector的形式,比如我们要知道schedule的回调函数,则使用schedule_selector,要指定按钮的回调函数则使用callfunc_selector
常用的selector如下:
schedule_selector :常用语定时器回调函数,函数无参数
callfunc_selector: 常用于定义动作回调函数,函数无参数
callfuncN_selector:常用于定义动作回调函数,函数带一个CCNode*参数
callfuncND_selector:常用于定义动作回调函数,函数带一个CCNode*参数和一个void* 参数(任意类型)
menu_selector:常用于地工艺菜单回调函数,带一个CCObject*参数
再发一个小的Demo
HelloWorld.h
void menuCloseCallback(cocos2d::Ref* pSender);
HelloWorld.cpp
init()里面
auto menuItem = MenuItemFont::create("A",this,menu_selector(HelloWorld::menuCloseCallback));
menuItem->setPosition(Vec2(480,320));
auto menu = Menu::create(menuItem,NULL);
menu->setPosition(Vec2(0,0));
this->addChild(menu);
init()外实现我们的函数
void HelloWorld::menuCloseCallback(cocos2d::Ref* pSender){
auto sprite = Sprite::create("Circle.png");
sprite->setPosition(Vec2(480,320));
this->addChild(sprite);
}
展示效果:
点击A后,
这个呢,就是一个关于菜单回调函数。
-----------------------------------------------------------
5:unSchedule 取消update函数调用
取消函数调用,不是不调用,而是调用一次
前面都说的,是如何调用回调,自然,也得有取消回调函数...........
只需要一句代码
在我们的update函数实现里加上语句话 this->unscheduleUpdate();
其实,所有的东西都是相对的,有开就有关,有执行就得有停止,所以取消和注册update函数的调用是相对的,但要记住,取消函数里也是不要参数的。
也许会问,这是系统的update()函数,那么我们自定义的回调应该怎么办?
其实,这和系统的update()函数关闭时一致的,如何注册,就如何取消,记住,千万别带参数
void HelloWorld::MutUpdate(float fDelta){
//CCLOG("mutUpdate");
CCLOG("MutUpdate fDelta = %f",fDelta);
this->unschedule(schedule_selector(HelloWorld::MutUpdate));//////
}
所有的停止回调,都是这种方法
---------------------------------------------------------------------------------------------------------
6:scheduleOnce 和回调 函数
我们平时写程序的时候,并不是所有的函数都要一直执行下去,其实说白了,就是希望我们只执行它一次,除了上面我们提到的,加一个取消命令外,我们其实可以直接建立一个只执行一次的回调
上代码-----------------------
首先,在原来的代码里加上一个函数
helloWorld.h
void callback(float t);
HelloWorld.cpp
init()函数里面回调:this->scheduleOnce(schedule_selector(HelloWorld::callback),3.0f);
init()函数外面实现:void HelloWorld::callback(float t){
log("1234");
}