我正在用SpriteKit物理引擎寫一個2D遊戲,其中光盤在一塊板上滑動(類似於從上到下的角度看空氣曲棍球遊戲)。大多數物理可以使用SpriteKit的默認屬性進行處理,但有一種特殊情況我認爲必須由我自己編寫。如何在檢測到接觸/碰撞後更正SKPhysicsBody的位置?
板的中心有一個圓形孔,圓盤可能落在其中。孔的大小隻比光盤大一點,所以如果光盤的中心足夠緩慢地通過光孔,光盤應該「吸引」到中心(因爲光盤會落入孔中)。同樣,如果整個光盤通過該孔,它應該彈回孔的邊界,因爲它完全落下。我還沒有完全確定如何寫物理,但我想我可以想出一些東西。我的問題是關於我應該在哪裏編寫代碼以及我可以使用哪些信息。
About SpriteKit頁面給出了SpriteKit在每一幀執行的不同步驟。利用與孔中心的接觸碰撞,我可以檢測到光盤通過孔的時間,因此當我需要增加力量或糾正光盤的移動時。但是,我不知道在SpriteKit週期中何時發生這種接觸檢測。如果是在物理模擬之後和場景渲染之前,那將會很好。
有沒有辦法在SpriteKit已經計算出所有物理體的新位置之前,但在它被顯示之前寫入一些代碼來執行,同時可以訪問每個物體的新位置和舊位置,類似於oldValue
在didSet
物業觀察員?如果沒有簡單的方法來獲得身體的新舊位置,我想我必須在每次更新時將自己的舊位置存儲爲屬性,但如果可能的話,我寧願避免這樣做。
如果在繪製物理模擬之前沒有簡單的方法來「糾正」物理模擬,我應該在哪裏編寫代碼來模擬光盤與中心孔交互的物理過程?
也許是一些具有徑向引力場的東西(真的很小的半徑,並且不夠強,不足以吸引真正快速移動的圓盤,模擬它們越過它而不是進入它)?這將限制它爲iOS 8+。你在第三段提到了「在物理模擬之後和渲染場景之前」,你正在尋找位於SKScene中的'didSimulatePhysics'(就像'update'一樣)。 – Gliderman
好的,我不知道SKField,我可以用這個和其他一些黑客攻擊(不完美,但現在足夠好)解決方案。 有一點測試回答了我的一個問題:'didBeginContact'發生在'update'後面,但是在幀週期中'didSimulatePhysics'之前。我仍然不知道是否有辦法編寫在didSimulatePhysics之前或之後執行的代碼,以便訪問節點的舊位置和新位置,以便在更改實際發生之前完成某些更正在現場更新... – Zanapher
didSimulatePhysics之前是didEvaluateActions。之後是didApplyConstraints。我認爲這是你想要的最後一個,因爲它在SpriteKit遊戲引擎移動所有內容之前調用,但在渲染場景之前調用它。 –