Por que meu sprite é exibido deslocado do corpo do Box2D?

7

Eu descobri isso usando um renderizador de depuração. Quando o jogo começa, tudo está em ordem. Mas quando ocorre uma colisão, a rotação do sprite é muito maior que seu corpo. O sprite e o corpo combinam quando o corpo está completamente horizontal.

sprites com contornos de corpo Box2D como sobreposição

A origem da rotação do sprite parece muito distante de onde deveria estar. Aqui está o meu código:

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());

Como você pode ver, estou até tentando definir o centro de sua rotação setOriginsem sucesso. Como posso consertar isso?

Tae-Sung Shin
fonte

Respostas:

9

A maioria das APIs representa a origem do Sprite no espaço local, não no espaço mundial. Isso é suportado pela documentação da libgdx, que afirma:

Um Sprite também tem uma origem em torno da qual rotações e redimensionamentos são realizados (ou seja, a origem não é modificada por rotação e redimensionamento). A origem é dada em relação ao canto inferior esquerdo do Sprite, sua posição .

Então, eu acho que se você quiser que as rotações aconteçam ao redor do centro do sprite, use a seguinte origem:

sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2);
David Gouveia
fonte
Você é realmente rápido. Você está certo sobre o setOrigin. Esse foi o truque. Muito obrigado! BTW, a declaração setPosition deve ser minha. Você precisa definir o ponto de canto para a posição do sprite.
Tae-Sung Shin
@ Paul notei o problema e editei minha postagem, mas você já havia comentado. :) Em algumas APIs, a origem também afeta a tradução (e foi por isso que escrevi inicialmente um setPosition diferente), mas depois verifiquei a documentação e descobri que não é o caso da libgdx, para que seu setPosition esteja correto.
David Gouveia