• cocos2dx3.X项目重写(七)观察者模式以及schedule引起的bug


    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">今天在加死亡场景的时候有,我先有一个判断,</span>
      if (player->getPositionY()<0)
    	   {
    		   Director::getInstance()->replaceScene(TransitionFade::create(0.5,overLayer::createScene()));
    
    	   }

    判断player的坐标如果不在范围内就直接切换场景,但是当死亡之后,会有几率出现一个bug,expression hashelement entry markedForDeletion,我查了一下,是由于schedule的重复执行,由于是在切换场景之后才产生的bug,所以有可能是以前的schedule没有注销掉,于是改变代码

      if (player->getPositionY()<0)
    	   {
    		   this->unschedule(schedule_selector(Stage::thisLayer_callback));
    		   this->unschedule(schedule_selector(Stage::addblock));
    		   Director::getInstance()->replaceScene(TransitionFade::create(0.5,overLayer::createScene()));
    
    	   }

    bug就消失了,处处小心啊同志们!

    ····························我是分割线·····················································

    由于前几天的时候,做了一个功能,就是在主角跳跃的时候,屏幕有一个跟随,看起来地面下降了,而主角还在屏幕中心,我是通过实时改变Layer的Y坐标实现的这个功能,但是问题来了,分数和按钮也一起动了,分数好说,直接放到背景Layer里面自加就行,但是按钮放到新的层要和这个层传输数据,于是用到了观察者模式。

    首先新建一个层,叫做Button_Layer,在这个层里面放一个按钮,在点击事件里面,发布数据

    	NotificationCenter::getInstance()->postNotification("jumpDown",NULL);

    在stage的init里面,接收数据

    	NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(Stage::Button_JumpDown_Msg),"jumpDown",NULL);

    然后在自定义函数Button_JumpDown_Msg里面写上对应的操作就好了。

    值得一提的是,如果我们注销了这个场景,或者切换场景之前要取消订阅消息,否侧会有一些找不到对象的bug。

           NotificationCenter::getInstance()->removeAllObservers(this);


    总结一句就是,shcedule和观察者的订阅消息,不用的时候要销毁。

  • 相关阅读:
    大数据产品对比
    3人3天3桶水9个人9天用几桶水
    skatebroads
    手机全面屏屏占比93%以上解决方案
    POC
    公司网站 解决方案 案例
    GBT 31000-2015 社会治安综合治理基础数据规范 数据项 编码
    GBT 33200-2016 社会治安综合治理 综治中心建设与管理规范 GBT 31000-2015 社会治安综合治理基础数据规范
    大数据 交警 户外广告设施管理监管系统平台高空坠物智慧社区城市城管警务
    破解爱奇艺腾讯优酷会员限制
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6091831.html
Copyright © 2020-2023  润新知