Bevor ich die Bewegung meines Sprites extrapolierte, funktionierte meine Kollision perfekt. Nach der Extrapolation auf die Bewegung meines Sprites (um die Dinge zu glätten) funktioniert die Kollision jedoch nicht mehr.
So funktionierten die Dinge vor der Extrapolation:
Nachdem ich meine Extrapolation implementiert habe, wird die Kollisionsroutine jedoch unterbrochen. Ich gehe davon aus, dass dies darauf zurückzuführen ist, dass es auf die neue Koordinate einwirkt, die von der Extrapolationsroutine (die sich in meinem Renderaufruf befindet) erzeugt wurde.
Nachdem ich meine Extrapolation angewendet habe
Wie kann ich dieses Verhalten korrigieren?
Ich habe versucht, unmittelbar nach der Extrapolation eine zusätzliche Kollisionsprüfung durchzuführen. Dies scheint viele Probleme zu lösen, aber ich habe dies ausgeschlossen, da es nicht in Frage kommt, Logik in mein Rendering zu integrieren.
Ich habe auch versucht, eine Kopie der spritesX-Position zu erstellen, diese zu extrapolieren und mit dieser anstelle des Originals zu zeichnen, sodass das Original intakt bleibt, damit die Logik es aufnehmen kann - dies scheint eine bessere Option zu sein, aber es erzeugt immer noch einige seltsame Effekte bei Kollisionen mit Wänden. Ich bin mir ziemlich sicher, dass dies auch nicht der richtige Weg ist, um damit umzugehen.
Ich habe hier ein paar ähnliche Fragen gefunden, aber die Antworten haben mir nicht geholfen.
Dies ist mein Extrapolationscode:
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);
}
Extrapolation anwenden
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);
}
Bearbeiten
Wie oben erwähnt, habe ich versucht, eine Kopie der Sprite-Koordinaten speziell zum Zeichnen zu erstellen. Dies hat seine eigenen Probleme.
Erstens, unabhängig vom Kopieren, wenn sich das Sprite bewegt, ist es super glatt, wenn es stoppt, wackelt es leicht nach links / rechts - da es immer noch seine Position basierend auf der Zeit extrapoliert. Ist das normal und können wir es ausschalten, wenn das Sprite stoppt?
Ich habe versucht, Flags für links / rechts zu haben und nur dann zu extrapolieren, wenn eines davon aktiviert ist. Ich habe auch versucht, die letzte und die aktuelle Position zu kopieren, um festzustellen, ob es einen Unterschied gibt. Bei Kollisionen helfen diese jedoch nicht weiter.
Wenn der Benutzer beispielsweise die rechte Taste drückt und sich das Sprite nach rechts bewegt, wenn es gegen eine Wand stößt und der Benutzer die rechte Taste weiterhin gedrückt hält, wird das Sprite weiterhin nach rechts animiert, während es von der Wand gestoppt wird ( daher nicht wirklich bewegend), aber da die richtige Flagge immer noch gesetzt ist und auch weil die Kollisionsroutine das Sprite ständig aus der Wand bewegt, scheint es dem Code (nicht dem Spieler) immer noch, dass sich das Sprite noch bewegt, und daher Die Extrapolation wird fortgesetzt. Was der Spieler also sehen würde, ist das "statische" Sprite (ja, es ist animierend, aber es bewegt sich nicht wirklich über den Bildschirm), und ab und zu zittert es heftig, wenn die Extrapolation versucht, es zu tun ..... .. Ich hoffe das hilft