cocos2d-x 场景切换时由资源预加载问题引起的场景无法切换的问题

来源:互联网 发布:c语言中volatile byte 编辑:程序博客网 时间:2024/04/30 03:59

问题描述


        做了一个游戏,有这样的逻辑(一般的游戏都有的吧),打开游戏,首先看到主菜单界面,点击"开始游戏",进入加载界面,加载完后是玩游戏,在游戏界面按暂停后会弹出暂停菜单,可以选择“继续游戏”,也可以选择“返回到主菜单”。我的问题来了。当从暂停界面返回到主菜单界面后,再次“开始游戏”,始终处在加载界面,进不去游戏界面。- -!


逻辑实现

图中的 replace 代表 replaceScene方法 ,push 代表pushScene方法,pop代表popScene方法

昨天晚上碰到的这个问题,今天跟代码研究了一上午,总算解决了。好累。


解决办法


       因为我是在loading 场景的init方法中(1)初始化loading场景界面,(2)加载游戏界面所需要的资源。游戏第一次运行没问题,当回到主菜单重新开始游戏才这样。刚开始就怀疑loading 加载资源的时候有问题。打断点,跟代码。一步一步调。后来发现确实是这样。我覆写了loading 场景的 onEnterTransitionDidFinish方法后,在这个方法中加载游戏界面所需要的资源,而在loading 场景的init中只初始化loading场景界面。(发现个有趣的现象,在loading界面异步加载的资源好像除了游戏退出不会自动释放,这就导致了第一次进游戏时可以看到那个loading条在滚动,而在从暂停界面返回到主菜单重新开始游戏时,那个loading界面只是闪了一下就过去了,很快的,这个以后再研究)。

以下是

我的log信息

1.mainmenu---》loading---》game

2.game---》pause

3.pause---》game

4.pause---》mainmenu

以上在没覆写loading 场景的 onEnterTransitionDidFinish方法时都很正常。

5.mainmenu---》loading---》game(从暂停界面返回到主菜单重新开始游戏)

可以看到在没覆写loading 场景的 onEnterTransitionDidFinish方法时,重新游戏 log信息是有不同的,左边的log中看到居然把GameScene给析构掉了,我擦。。。。。。


怎么理解


这其实是pushScene/popScene和replaceScene的区别了。这就不多说了。相信很多人都明白。说下几个方法的调用时机

init------》create时调用

onEnter------》init后会调用

onEnterTransitionDidFinish-------》onEnter后会调用

onExit------》dealloc 后调用

调用replaceScene方法替换场景时, 每个节点都会调用CCNode所带的 onEnter, onEnterTransitionDidFinish和onExit这三个方法。

init一般初始化界面,如果要加载很多资源最好放在 onEnterTransitionDidFinish 里面去做。这是拙见,有更好的解决方法欢迎讨论。


好了,终于解决了。苦逼的程序猿啊。哎。。。。。。