Chipmunk僵尸物理对象的出现和解决(七)
来源:互联网 发布:淘宝封号支付宝用不了 编辑:程序博客网 时间:2024/05/16 13:38
首先判断问题出现在Star的类方法doStickShorterWork中,于是逐步分词注释代码,最后剩下如下代码:
+(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删除时,碰撞回调方法已经返回,则一切正常.这也符合僵尸对象随机出现的现象.
0 0
- Chipmunk僵尸物理对象的出现和解决(七)
- Chipmunk僵尸物理对象的出现和解决(一)
- Chipmunk僵尸物理对象的出现和解决(二)
- Chipmunk僵尸物理对象的出现和解决(三)
- Chipmunk僵尸物理对象的出现和解决(四)
- Chipmunk僵尸物理对象的出现和解决(五)
- Chipmunk僵尸物理对象的出现和解决(六)
- Chipmunk僵尸物理对象的出现和解决(八)
- chipmunk物理引擎的基本概念和基本用法
- Box2D和Chipmunk的对比 Cocos2d-x物理引擎
- chipmunk物理引擎的基本概念和基本用法
- chipmunk物理引擎
- 物理引擎chipmunk
- 物理引擎chipmunk
- 物理引擎chipmunk
- Chipmunk物理引擎总结
- Chipmunk物理引擎
- Cocos2d-x 3.0中的新物理引擎:Chipmunk和Box2d
- Dagger高级用法:任性inject
- 第九周项目3 稀疏矩阵加法运算
- tcp与udp的总结
- 笔记本安装黑苹果
- poj 2406 Power Strings next[]
- Chipmunk僵尸物理对象的出现和解决(七)
- MyEclipse中的两种FreeMarker插件的安装与配置
- java调用url的两种方式
- 安卓5.1 取消关机菜单
- 如何提高Unity Gear VR游戏性能
- iOS获取当前版本号 Bundle Id等信息的方法
- 循环引用宏
- 微信企业号让IOS不要识别数字为电话号码的方法
- 解决办法之“超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小 ”