cocos2dx-3.0(29) 调度器(scheduler)

~~~~我的生活,我的点点滴滴!!

         参照官方介绍


一、介绍

cocos2d-x调度器为游戏提供定时事件和定时调用服务,他直接继承自根Ref,所有Node对象都知道如何调度和取消调度事件,
使用调度器有几个好处:

1、每当Node不再可见或已从场景中移除时,调度器会停止。
2、cocos2d-x暂停时,调度器也会停止。当Cocos2d-x重新开始时,调度器也会自动继续启动。
3、cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险。
4、调度器(scheduler)的update将是每帧被调用,并且我们可以自定义优先级
5、自定义的调试器尽可能的少用,使用默认调度器('update selector')


二、用法


游戏中我们经常会随时间的变化而做一些逻辑判断,如碰撞检测,为了解决以上问题,我们引入了调度器,这使得游戏能够更好的处理动态事件。
cocos2d-x提供了多种调度机制,在开发中我们通常会用到3种调度器:

1、默认调度器:schedulerUpdate()
2、自定义调度器:schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
3、单次调度器:scheduleOnce(SEL_SCHEDULE selector, float delay)

下面我们来简单的介绍一下这三种

1、默认调度器(schedulerUpdate)

该调度器是使用Node的刷新事件update方法,该方法在每帧绘制之前都会被调用一次。由于每帧之间时间间隔较短,
所以每帧刷新一次已足够完成大部分游戏过程中需要的逻辑判断。

但是 cocos2d-x中Node默认是没有启用update事件的,因此你需要重载update方法来执行自己的逻辑代码。

通过执行schedulerUpdate()调度器每帧执行 update方法,如果需要停止这个调度器,可以使用unscheduleUpdate()方法。

看下面的代码:

    /*
     * Update method will be called automatically every frame if "scheduleUpdate" is called, and the node is "live"
     */
    virtual void update(float delta);

我们在来看实现

// override me
void Node::update(float fDelta)
{
	//....
}


override me 提示,必须重载自己实现,所以我们先在我们的头文件中重载此函数

	//重载node父类的update
	void update(float dt) override;

然后在init()中开启

bool HelloWorld::init()
{
	......
	
	//开启
	scheduleUpdate();
	
	//关闭
	//unscheduleUpdate();
	
	return true;
}

void HelloWorld::update(float dt)
{
	log("updating!!!");
}



运行后就会发现,不停的在输出

updating!!!
updating!!!
updating!!!
updating!!!
updating!!!
updating!!!

2、自定义调度器(scheduler)

游戏开发中,在某些情况下我们可能不需要频繁的进行逻辑检测,这样可以提高游戏性能。所以Cocos2d-x还提供了自定义调度器,可以实现以一定的时间间隔连续调用某个函数。

由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在0.1秒以上。

同样,取消该调度器可以用void unschedule(SEL_SCHEDULE selector);

以下代码用来测试该调度器:

头文件中添加自定义函数

	//自定义用户update函数
	void updateCustom(float dt);

在init函数中开启动

bool HelloWorld::init()
{
	......
	
	//开启自定义调度器
	/* selector  回调函数指针
	*  interval  单位为秒,如果为0那就暗示使用scheduleUpdate()了
	*  repeat    执行数次,是repeat+1次,即首先执行一次,然后在执行repeat次,如果使用kRepeatForever那就无限次
	*  delay     执行第一次需要等待的时间
	*/
	schedule(schedule_selector(HelloWorld::updateCustom), 1.0f, kRepeatForever, 0);

	//关闭
	//unschedule( schedule_selector(HelloWorld::updateCustom));
	
	return true;

}

void HelloWorld::updateCustom(float dt)
{
	log("Custom!!!");
}


schedule函数参数的说明已经在注释中写明了。在下面接着补充下吧

scheduler(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)函数里面的参数:
第一个参数selector即为你要添加的事件函数
第二个参数interval为事件触发时间间隔
第三个参数repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数
第四个参数delay表示第一次触发之前的延时

看下输出

Custom!!!
Custom!!!
Custom!!!
Custom!!!
Custom!!!
Custom!!!
Custom!!!
Custom!!!
基本上是1s输出一个


3、单次调度器(schedulerOnce)

游戏中某些场合,你只想进行一次逻辑检测,Cocos2d-x同样提供了单次调度器。

该调度器只会触发一次,用void unschedule(SEL_SCHEDULE selector);来取消该触发器,但是基于对单次调试器根本不需要取消,因为他只执行一次就自己停止了

以下代码用来测试该调度器:

//自定义一次调度器回调函数
void updateOnce(float dt);

bool HelloWorld::init()
{
    ...
	
    scheduleOnce(schedule_selector(HelloWorld::updateOnce), 0.1f);
	
    return true;
}

void HelloWorld::updateOnce(float dt)
{
    log("Once");
}



这次就只有一个输出信息

Once

cocos2dx官方建议为了跨平台和效率考虑,不要使用Timer之类的,这样我们只需要把精力都放在游戏框架与功能上面


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值