schedule就是定时器,通过调用API则可以确定延迟W秒,间隔X秒执行Y次Z函数。通过传入的 W,X,Y,Z函数即可实现定时操作。。
话不多说,先上程序,下面是三种定时器常见用法。。
#include "HelloWorldScene.h"
#include "ui/UILayout.h"
USING_NS_CC;
void HelloWorld::fun_Callback(float x)
{
printf("time == 66\n");
}
Scene* HelloWorld::createScene()
{
return HelloWorld::create();
}
bool HelloWorld::init()
{
// 1. super init first
if ( !Scene::init() )
{
return false;
}
printf("1\n");
//this->schedule(CC_SCHEDULE_SELECTOR(HelloWorld::fun_Callback), 1.0f); //每一秒运行依次fun_Callback()函数
//this->schedule(CC_SCHEDULE_SELECTOR(HelloWorld::fun_Callback), 1.0f, 10, 4.0f); //延迟4s开始执行10次fun_Callback()函数,每次执行函数的间隔时间为1s
需要自己添加一个字符串显示的组件label
this->schedule(
[this, label](float dt) { //lambad函数的写法
if (time_count > 0) {
time_count -= 1;
if (label && (time_count == 0)) {
label->setString("time is up");
}
} else {
this->unschedule("hell0_timer1");
}
},
1.0f, time_count - 1, 0.0f, "hello_timer1");
return true;
}
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
class HelloWorld : public cocos2d::Scene
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld);
virtual void fun_Callback(float x);
};
#endif // __HELLOWORLD_SCENE_H__
schedule用起来还是很简单的,就是学API麻,但有一些点需要注意一下。
1.查看定义发现:回调函数类型是std::function<void(float)>& callback,所以回调函数必须是定义为 void func_callbak(float );类型的函数。
2.cocos的组件如果需要在回调函数中去调用,一定要注意内存释放时间的问题,因为cocos使用的是自动内存管理机制(另起一篇),所以可能在定时3s的时候,第二秒label的内存就被异常释放了,导致程序crash,所以这个时候。有两种思路来避开这个问题:一。需要在使用有关指针的时候先进行检查,保证不会因为空指针导致程序崩溃。二。每次使用完此组件通过this->retain()来维护引用计数,从而防止被自动释放。三。避开自动内存管理,自己手动来new和delete内存。
*******************************************************2021-9-28*********************************
3. 今天又被这玩意儿坑到了,this->schedule(callback, ....); callback函数传入了变量,如果在定时n秒之后需要调用这些变量,那就要必须保证这个变量几秒后还存在,如果在callback这个函数里面用了函数指针更需要注意这个问题。我就是在这个callback函数调用了空指针导致了crash....
所以啊,需要这个函数里面用的变量为static的,或者每次调用callback去检查指针啊。。不应该在外面传入指针直接用。。。
4.this->schedule();这个是调用cocos的默认定时器。。
this->scheduleonce();这个是调用的自定义的定时器。。。建议用这种,因为这种只要保证调用的this指针不为空,这个定时器就不会有问题。。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1755004182a5225726.html
评论列表(0条)