Chipmunk僵尸物理对象的出现和解决(七)
2015-11-09 17:28
369 查看
首先判断问题出现在Star的类方法doStickShorterWork中,于是逐步分词注释代码,最后剩下如下代码:
省略掉了stick变短动画和恢复尺寸的代码,问题依旧.
在经过N次注释,编译,运行的Loop后,将问题逐渐锁定在stick没有正确删除上.遂再次推理涉及到可能删除与引用冲突的代码逻辑.
最后推断如果在五角星碰撞stick后,在碰撞回调中如果此时删除了stick会发生什么!?这肯定不是物理引擎愿意看到的情形:在物理对象的碰撞回调中,该物理对象竟然被删除了!这个显然不合常理,但在该App中是有可能发生的.
如果在Star类方法中stick删除代码调用时,碰撞回调方法还未返回,就会发生stick已经没有了,同时物理引擎还认为其存在的情况.
简单来说如果stick删除时,碰撞回调在运行就会出现僵尸对象,如果stick删除时,碰撞回调方法已经返回,则一切正常.这也符合僵尸对象随机出现的现象.
+(void)doStickShorterWork:(Stick *)stick{ GameScene *gameScene = [GameScene sharedGameScene]; CCPhysicsNode *physicsWorld = (CCPhysicsNode*)stick.parent; @synchronized(gameScene){ if ([stick.name isEqualToString:@"stickShorter"]) { return; } if ([stick.name isEqualToString:@"stickLonger"]) { Stick *stickNormal = [Stick stickNormal]; stickNormal.position = stick.position; [physicsWorld removeChild:stick cleanup:YES]; [physicsWorld addChild:stickNormal]; gameScene.stickInGameScene = stickNormal; return; } } CGPoint position = stick.position; __block Stick *stickShorter; @synchronized(gameScene){ stickShorter = [Stick stickShorter]; [physicsWorld removeChild:stick cleanup:YES]; stickShorter.position = position; [physicsWorld addChild:stickShorter]; gameScene.stickInGameScene = stickShorter; } }
省略掉了stick变短动画和恢复尺寸的代码,问题依旧.
在经过N次注释,编译,运行的Loop后,将问题逐渐锁定在stick没有正确删除上.遂再次推理涉及到可能删除与引用冲突的代码逻辑.
最后推断如果在五角星碰撞stick后,在碰撞回调中如果此时删除了stick会发生什么!?这肯定不是物理引擎愿意看到的情形:在物理对象的碰撞回调中,该物理对象竟然被删除了!这个显然不合常理,但在该App中是有可能发生的.
如果在Star类方法中stick删除代码调用时,碰撞回调方法还未返回,就会发生stick已经没有了,同时物理引擎还认为其存在的情况.
简单来说如果stick删除时,碰撞回调在运行就会出现僵尸对象,如果stick删除时,碰撞回调方法已经返回,则一切正常.这也符合僵尸对象随机出现的现象.
相关文章推荐
- 如何解决双网卡冲突
- 两个打印机服务spoolsv.exe存在冲突的解决方法
- setAttribute 与 class冲突解决
- jQuery与其它库冲突的解决方法
- 解决jquery版本冲突的有效方法
- 快速解决jQuery与其他库冲突的方法介绍
- 加载jQuery后$冲突的解决办法
- 关于svn冲突的解决方法
- 避免Smarty与CSS语法冲突的方法
- 数据转换冲突及转换过程中大对象的处理
- PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
- ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
- asp.net开发与web标准的冲突问题的一些常见解决方法
- transport.js和jquery冲突问题的解决方法
- 从ip地址冲突找根源
- 巧用“IP地址冲突” 揪出ARP病毒
- 什么僵尸进程
- 如何删除openstack nova里的僵尸实例
- 有些无线客户端无法通过cisco871路由器DHCP获得ip
- IP地址冲突问题的解决方法