cocos2d-x学习总结之schedule的局限性

来源:互联网 发布:snow拍照软件下载 编辑:程序博客网 时间:2024/05/26 02:19

在cocos2d-x中schedule的作用就不多说了。先看看在项目中的实际用法。

1.策划需求:

在2个CCSence中都需要显示玩家的分数,如果玩家的分数小于一个阈值则定时给玩家增加分数。

 2.程序实现:
看到这个需求后,不由得会想到在2个场景中用schedule启动一个函数来增加分数。

结果:在单独的场景中分数在满足条件的时候会定时增加。然而在这2个场景进行切换的时候却出现问题。

问题:在第一个场景增加分数后,立即切换到下一个场景那么另一个场景的schedule会启动函数增加分手,此时的增加分数的时间间隔就出现了误差。

3.问题分析:

原因在于我们使用的schedule函数的生命周期是与其所在的CCSence的生命周期是一致的。对于当前的程序的结构而言,每一个CCSence中只存放了一个 CCLayer .将所有的层(像捕鱼达人的程序那样)放在一个CCSence中需要对整个程序重写不划算(当然出现这种问题的原因主要是前期经验不足造成的)像捕鱼达人那样,将不同的元素放到不同的层中,是我们前期必须考虑好的。

4.解决方法

只能死马当活马医了,创建一个全局的定时器。在网上查到定义一个全局schedule的方法。看上去比较复杂,弃之。采用boost库中的线程

定时执行一个函数_bet_thread.reset(this,&bet_data::post_increase_event, 60,bet_data_thread::sleep_seconds); 向cocos2d-x的消息中心发

送消息。通过CCNotificationCenter::sharedNotificationCenter()->addObserver注册了该消息的CCLayer会收到消息并执行绑定的函数增加分数。

结果出人意料。bet_data::post_increase_event函数并不在ui线程里面。如果在该函数里面向ccxx消息中心发送消息后,是立即执行的也就是会立即

更新 ui. 这里会出现问题。为解决这个问题,借鉴前面之前用到的方式,在bet_data::post_increase_event中不使用ccx的消息中心,而是向我们之前定义

的全局队列中post一个消息,在ui中异步执行。


 OK 今天就这么多吧

接下去会总结上面提到的boost线程的使用问题,和异步post消息。


原创粉丝点击