cocos 2dx--------schedule(五)

schedule就是定时器,通过调用API则可以确定延迟W秒,间隔X秒执行Y次Z函数。通过传入的 W,X,Y,Z函数即可实现定时操作。。话不多说,先上程序&#xff0

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信