スプライトの動きに外挿を適用する前は、衝突は完全に機能していました。ただし、(物事を滑らかにするために)スプライトの動きに外挿を適用すると、衝突が機能しなくなります。
これが、外挿前の動作です。
しかし、外挿を実装した後、衝突ルーチンが壊れます。これは、(レンダーコールにある)外挿ルーチンによって生成された新しい座標に作用しているためと考えています。
外挿を適用した後
この動作を修正するには?
外挿の直後に追加の衝突チェックを試みました-これは多くの問題を解決するようですが、レンダリングにロジックを入れることは問題外なので、これを除外しました。
私はまた、spritesXの位置のコピーを作成し、それを外挿して、オリジナルではなくそれを使用して描画してみたので、元のロジックをそのままにして、ロジックがピックアップできるようにしました。壁にぶつかったとき。これもこれに対処する正しい方法ではないと確信しています。
ここで似たような質問をいくつか見つけましたが、答えは役に立ちませんでした。
これは私の外挿コードです:
public void onDrawFrame(GL10 gl) {
//Set/Re-set loop back to 0 to start counting again
loops=0;
while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){
SceneManager.getInstance().getCurrentScene().updateLogic();
nextGameTick+=skipTicks;
timeCorrection += (1000d/ticksPerSecond) % 1;
nextGameTick+=timeCorrection;
timeCorrection %=1;
loops++;
tics++;
}
extrapolation = (float)(System.currentTimeMillis() + skipTicks - nextGameTick) / (float)skipTicks;
render(extrapolation);
}
外挿の適用
render(float extrapolation){
//This example shows extrapolation for X axis only. Y position (spriteScreenY is assumed to be valid)
extrapolatedPosX = spriteGridX+(SpriteXVelocity*dt)*extrapolation;
spriteScreenPosX = extrapolationPosX * screenWidth;
drawSprite(spriteScreenX, spriteScreenY);
}
編集する
上で述べたように、私は特に描画するためにスプライトの座標のコピーを作ってみました...これにはそれ自身の問題があります。
まず、コピーに関係なく、スプライトが動いているときは非常に滑らかで、停止しているときは、時間に基づいて位置を推定しているため、左/右にわずかに揺れています。これは正常な動作ですか?スプライトが停止したときに「オフ」にできますか?
左/右のフラグを設定して、これらのいずれかが有効になっている場合にのみ外挿してみました。最後の位置と現在の位置をコピーして、違いがないか確認しました。ただし、衝突に関する限り、これらは役に立ちません。
ユーザーが言う、右ボタンとスプライトが右に移動している場合、壁にぶつかったときにユーザーが右ボタンを押し続けると、スプライトは壁に止められている間、右に動き続けます(したがって、実際には移動していません)。ただし、正しいフラグが設定されたままであり、衝突ルーチンが常にスプライトを壁の外に移動しているため、スプライトがまだ移動していることが(プレーヤーではなく)コードに表示されます。外挿が続行されます。だからプレーヤーが見るのは、スプライトの「静的」(はい、それはアニメーションですが、実際には画面上を移動していません)であり、外挿がそれを実行しようとすると、時々激しく揺れます... ..この助けを願っています