SpriteBuilder复杂CCB在App场景加载时报错排查
2015-10-29 10:09
459 查看
Player.CCB由body和arm两部分组成,它们都开启物理使能.
在GameScene.ccb中新建一个物理对象,将Player.ccb拖入该对象.此时编译运行App均正常.
然后继续添加其他物理对象Wall.ccb组成屏幕边界,这时App运行发生错误,log为:
发现源代码中断在场景的初始化方法中,该方法的功能是递归调用场景中每个子CCNode的didLoadFromCCB方法.
接下来删除Player对象,再添加Player对象,这时App运行又正常.多次测试发现,只有当最后一个对象是Player时程序才不出错.
但是不能到这里停止.假如游戏场景中要有2个Player对象真么办?总有一个不是最后一个对象.所以还得找原因.
因为异常发生在didLoadFromCCB的递归调用中,而Player只有arm子对象添加了该函数.遂将其注释掉,在添加多个Player的情况下App运行正常.
这时可以锁定是arm类Arm中的didLoadFromCCB方法里做了不应该的事.检查该方法,发现其间接使用了GameScene.ccb中的物理对象:
注意,在GameScene.ccb子对象的枚举过程中修改了物理对象.只有Player放在物理对象的最后才不会出错.
知道了问题所在,简单的取消Arm中对物理对象的引用就可以了,将必要的逻辑放到GameScene类里去即可.
在GameScene.ccb中新建一个物理对象,将Player.ccb拖入该对象.此时编译运行App均正常.
然后继续添加其他物理对象Wall.ccb组成屏幕边界,这时App运行发生错误,log为:
Collection <__NSArrayM: 0x78f97730> was mutated while being enumerated
发现源代码中断在场景的初始化方法中,该方法的功能是递归调用场景中每个子CCNode的didLoadFromCCB方法.
接下来删除Player对象,再添加Player对象,这时App运行又正常.多次测试发现,只有当最后一个对象是Player时程序才不出错.
但是不能到这里停止.假如游戏场景中要有2个Player对象真么办?总有一个不是最后一个对象.所以还得找原因.
因为异常发生在didLoadFromCCB的递归调用中,而Player只有arm子对象添加了该函数.遂将其注释掉,在添加多个Player的情况下App运行正常.
这时可以锁定是arm类Arm中的didLoadFromCCB方法里做了不应该的事.检查该方法,发现其间接使用了GameScene.ccb中的物理对象:
_phyWorld = (CCPhysicsNode*)self.parent.parent; CCLOG(@"name is %@",_phyWorld.name); //省去无关代码 for (int i = 0; i < MAX_BULLETS; i++) { bullet = [CCBReader load:@"Sprites/Bullet"]; bullet.visible = NO; [_phyWorld addChild:bullet]; }
注意,在GameScene.ccb子对象的枚举过程中修改了物理对象.只有Player放在物理对象的最后才不会出错.
知道了问题所在,简单的取消Arm中对物理对象的引用就可以了,将必要的逻辑放到GameScene类里去即可.
相关文章推荐
- SpriteBuilder复杂CCB在App场景加载时报错排查
- android中Invalidate和postInvalidate的区别
- Android中AIDL及其使用
- 寻找ios培训机构
- android执行外部命令、检测文件是否存在、自动检测U盘路径
- iOS开发10种数据传值方法
- Android ListView 异步加载图片乱序问题,原因分析及解决方案
- AndroidStudio的经典教程(干货)
- android 4.0 全屏 屏蔽下面的status bar
- nodejs 之express 笔记 app.helpers 和 app.locals
- 第一个简单的android项目
- Android Messenger 跨进程通信
- iOS手势类的简单使用
- Android菜鸟的成长笔记——ViewPager图片循环
- iOS 项目上架后的加急审核 2015.10.29
- Unity中单例模式的使用
- cocos2dx-js RenderTexture 将多张图片合并成一张图片
- Application Loader上传中断,提示Cannot proceed with delivery: an existing transporter instance is currently
- iOS App打包流程
- 一个iOS上的秒表小应用的实现方法分享