日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Chipmunk僵尸物理对象的出现和解决(七)

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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僵尸物理对象的出现和解决(七)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。