过关场景跳转
雷哥啊,你那个过关后的场景跳转怎么弄的?你说休息时间改的,直接调用toGameScene方法,看到效果是怪物死了后又复活了,这个是怎么弄的,,我在判定怪物死完后,调用toGameScene,当怪物死了程序就崩了。。。应该是那个地方没处理,怎么弄的啊求救雷哥!!
雷哥啊,你那个过关后的场景跳转怎么弄的?你说休息时间改的,直接调用toGameScene方法,看到效果是怪物死了后又复活了,这个是怎么弄的,,我在判定怪物死完后,调用toGameScene,当怪物死了程序就崩了。。。应该是那个地方没处理,怎么弄的啊求救雷哥!!
2015-08-18
我写的也是同样崩,最后我分析大概是因为ControlLayer::purge()将ControlLayer类的所有成员都释放了,tsm的内存也被回收掉了,所以导致ControlLayer::update函数中再tsm->toGameScene();就崩了。
然后:
1,在DataManager里加入成员:SceneManager* sceneManager;
2,在AppDelegate::applicationDidFinishLaunching()中创建完SceneManager对象之后加上一句:DataManager::getInstance()->sceneManager = sceneManager;
3,在ControlLayer::update中用DataManager::getInstance()->sceneManager->toGameScene();代替tsm->toGameScene();
我这么改肯定是不专业,但是这么一折腾不崩了。
这个问题困扰了我好久,最后大概弄清楚了原因。应该是schudule方法的bug吧,unSchedule之后还会执行一帧update方法。这时问题就来了:在上一帧中已经释放了ControlLayer中的所有资源,所以这一帧的update方法中会报各种野指针错误(EXC_BASD_ACCESS)。
顺序大概是这样(ControlLayer1:upadte(释放资源、停止定时器) -> 创建ControLayer2 -> ControlLayer1:upadte(崩))
原因嘛,就是这样,解决方法我也太不会。我是在update开始加一句判断,if(indexLevel != DataManager::getInstance()->getLevelIndex()) return; (indexlLevel 在init方法里初始化为DataManager里的level)。虽然做法很差,但也达到效果了
举报