Chipmunk僵尸物理对象的出现和解决(七)
生活随笔
收集整理的這篇文章主要介紹了
Chipmunk僵尸物理对象的出现和解决(七)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先判斷問題出現在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刪除時,碰撞回調方法已經返回,則一切正常.這也符合僵尸對象隨機出現的現象.
總結
以上是生活随笔為你收集整理的Chipmunk僵尸物理对象的出现和解决(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ueditor/自定义配置
- 下一篇: 抓住大数据时代的红利