博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpriteBuilder复杂CCB在App场景加载时报错排查
阅读量:6955 次
发布时间:2019-06-27

本文共 911 字,大约阅读时间需要 3 分钟。

Player.CCB由body和arm两部分组成,它们都开启物理使能.

在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类里去即可.

转载地址:http://hgtil.baihongyu.com/

你可能感兴趣的文章
判断字符串是否为时间格式
查看>>
HTML框架1
查看>>
201621123075 Week02-Java基本语法与类库
查看>>
【实习记】2014-08-10(上)代码跟踪git的想法+归并排序的debug过程
查看>>
洛谷3805:【模板】manacher算法——题解
查看>>
POJ3666:Making the Grade——题解
查看>>
ZABBIX监控原理
查看>>
json 解析不出来 (No string key for value in object around character 6)
查看>>
mysql数据库配置open_files_limit过大导致数据库被OOM
查看>>
Dijkstra算法(迪杰斯塔拉算法)
查看>>
SDK编程模板
查看>>
避免反射和序列化来破坏单例
查看>>
js trim()
查看>>
POJ3468 线段树求和(线段树模板2)
查看>>
安装配置postgreSQL+pgcli+pgadmin3
查看>>
详解一下 javascript 中的比较
查看>>
用javascript实现jquery的trim方法
查看>>
编程入门:详细对比9门主流编程语言
查看>>
springcloud demo---hystrix
查看>>
DFS
查看>>