0

パーティクルの軌跡を残すために、プレーヤーの中心に 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


アップルドキュメントのフレームサイクルは次のとおりです ここに画像の説明を入力

4

2 に答える 2

0

すべてのフレームでエミッターを手動で再配置するのではなく、SpriteKit に任せてください。エミッターをプレイヤー スプライトの子ノードにすると、プレイヤーが移動するたびにエミッター ポイントがプレイヤーに対して同じ位置に留まります。

この方法を使用すると、放出されたパーティクルが望ましくない方法でプレイヤーを追跡するという問題が発生する可能性があります。targetNodeこれは、エミッターをプレイヤーを含むノードに設定することで解決できます。

于 2014-11-05T22:10:03.673 に答える
0

あなたのコードは、プレーヤーの次の位置を推定するだけです。衝突、力場、線形減衰など、プレーヤーの位置に影響を与える可能性のある他の要因は考慮されません。didSimulatePhysics コールバックでエミッターの位置をプレーヤーの位置に設定するか、エミッターをプレーヤーの子として追加することをお勧めします。 .

于 2014-11-05T21:52:08.953 に答える