Warum wird mein Sprite versetzt zu seinem Box2D-Körper angezeigt?

7

Ich habe dies mit einem Debug-Renderer herausgefunden. Wenn das Spiel beginnt, ist alles in Ordnung. Aber wenn eine Kollision passiert, ist die Rotation des Sprites viel größer als sein Körper. Das Sprite und der Körper stimmen überein, wenn der Körper vollständig horizontal ist.

Sprites mit Box2D-Körperumrissen als Overlay

Der Rotationsursprung des Sprites scheint weit davon entfernt zu sein, wo er sein sollte. Hier ist mein Code:

Sprite sprite = data.sprite;
position = body.getPosition();
sprite.setPosition(
    position.x - sprite.getWidth()  / 2,
    position.y - sprite.getHeight() / 2
);
sprite.setOrigin(position.x, position.y);
sprite.setRotation(MathUtils.radiansToDegrees * body.getAngle());

Wie Sie sehen können, versuche ich sogar setOriginerfolglos , den Mittelpunkt seiner Rotation festzulegen. Wie kann ich das beheben?

Tae-Sung Shin
quelle

Antworten:

9

Die meisten APIs repräsentieren den Ursprung des Sprites im lokalen Raum, nicht im Weltraum. Dies wird durch die Dokumentation von libgdx unterstützt, in der es heißt:

Ein Sprite hat auch einen Ursprung, um den Rotationen und Skalierungen durchgeführt werden (dh der Ursprung wird nicht durch Rotation und Skalierung geändert). Der Ursprung wird relativ zur unteren linken Ecke des Sprite angegeben, seine Position .

Ich denke also, wenn Sie möchten, dass Rotationen um die Mitte des Sprites stattfinden, sollten Sie stattdessen den folgenden Ursprung verwenden:

sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2);
David Gouveia
quelle
Du bist wirklich schnell. Sie haben Recht mit setOrigin. Das war der Trick. Vielen Dank! Übrigens sollte die setPosition-Anweisung von mir stammen. Sie müssen den Eckpunkt für die Sprite-Position festlegen.
Tae-Sung Shin
@Paul Ich habe das Problem bemerkt und meinen Beitrag bearbeitet, aber du hattest bereits einen Kommentar abgegeben. :) In einigen APIs wirkt sich der Ursprung auch auf die Übersetzung aus (weshalb ich ursprünglich eine andere setPosition geschrieben habe), aber dann habe ich die Dokumentation überprüft und festgestellt, dass dies bei libgdx nicht der Fall ist, sodass Ihre setPosition korrekt war.
David Gouveia