パーティクルの軌跡を残すために、プレーヤーの中心に SKEmitterNode を配置しています。私のプレーヤーには物理ボディがあり、手動で位置を更新するのではなく、物理によって動かされます。
私が抱えている問題は、プレーヤーの速度が上がると、パーティクルがプレーヤーの後ろのポイントから放出されることです。フレームサイクルの「アクションの評価」部分でパーティクルが放出されるため、これが発生していることを発見しました。その後、私のプレーヤーは「物理シミュレーション」の部分に動かされます。
回避策として私が見つけた解決策は、SKEMitterNode (アップデート コールバック内) を、物理計算後にプレイヤーがいるポイントに移動することです。これは私が使用したコードです:
particleEmitter.position = CGPointMake(
player.position.x + player.physicsBody!.velocity.dx * dt,
player.position.y + player.physicsBody!.velocity.dy * dt
)
更新
最初は、エミッターをプレーヤーの子ノードとして使用していましたが、問題が発生したときです。
また、最後の更新以降に移動した距離 (速度 * dt) を考慮せずに、エミッターの位置をプレーヤーの位置に正確に同期しようとしましたが、同じ問題がありました。
私の質問は、これを解決する正しい方法は何でしょうか?
更新 2
問題を示すプレイグラウンドを作成しました。ここでは、プレイヤーの子としてエミッターを持っています。プレイヤーの速度を上げるほど、プレイヤーと放出されたパーティクルとの間のギャップが大きくなります。
https://github.com/ovidiupruteanu/SKEmitterNodeTest-Playground
アップルドキュメントのフレームサイクルは次のとおりです