2014-11-05 32 views
0

我都集中在我的球員離開顆粒的蹤跡的SKEmitterNode。我的球員有一個物理機構,它受物理學的影響,而不是手動更新它的位置。物理學之前SKEmitterNode發光粒子模擬

我遇到的問題是,當我的球員的速度提高了顆粒從播放器背後的一個點發出。 我發現發生這種情況的原因是粒子是在幀週期的「評估動作」部分發射的。我的玩家後來被「模擬物理」部分所感動。

我發現作爲一種解決方法是移動SKEmitterNode(在更新回調)的地步,我的球員將是物理計算後的解決方案。這是我使用的代碼:

particleEmitter.position = CGPointMake(
    player.position.x + player.physicsBody!.velocity.dx * dt, 
    player.position.y + player.physicsBody!.velocity.dy * dt 
) 

UPDATE
起初,我有我的發射器作爲玩家的一個子節點,則是當我觀察到的問題。
我也試圖精確地給玩家位置同步的發射器的位置,不考慮自上次更新(速度* DT)移動距離,同樣的問題。

我的問題是,這將是解決這個的正確方法是什麼?

更新2
我創建了一個演示問題的操場。這裏我有發射器作爲播放器的孩子。你增加玩家的速度越多,玩家和發射粒子之間的差距就越大。
https://github.com/ovidiupruteanu/SKEmitterNodeTest-Playground


下面是來自蘋果文檔 enter image description here

+0

你的問題是什麼?你在尋找替代方案嗎? – rickster 2014-11-05 21:26:18

+0

經過一些更多的測試並看到@ 0x141E的答案,我發現我的解決方法存在一些問題。例如,當玩家通過與另一個物體碰撞而完全停止(在高速行進之後)時,在玩家停止的點之外產生一些粒子。 – Ovidiu 2014-11-06 04:34:57

回答

0

你的代碼只估計玩家的下一個位置的幀週期。它不考慮可能影響玩家位置的其他因素,例如碰撞,力場,線性阻尼等。我建議您將發射器的位置設置爲didSimulatePhysics回調中玩家的位置,或者將發射器添加爲玩家的孩子。

+0

我確實試過了你的建議。問題在於粒子在到達didSimulatePhysics回調函數時已經生成,因此只需在該點設置玩家位置的位置不會有幫助。 我知道我所做的是估計球員的下一個位置,然而這是我所見過的一個很好的估計。 – Ovidiu 2014-11-05 23:28:39

+0

如果玩家移動速度太快以致失去子女,那麼您可能已經超出了sprite套件可以處理的範圍。 – 0x141E 2014-11-06 08:13:34

0

不是在每一幀上手動重新定位發射器,而是讓SpriteKit爲您工作:使發射器成爲玩家精靈的子節點,並且發射器點將停留在與玩家相同的位置移動。

如果你走這條路線,你可能有發射粒子也按照你不希望的方式播放的一個問題。您可以通過將發射器的targetNode設置爲包含播放器的節點來解決此問題。