SFML - 使用变换围绕其中心旋转精灵

SFML - Rotating a sprite around its center using a Transform

我有一个对象需要能够绕其中心旋转,但要保持原点相同(用于设置位置等)。所以,我想我需要使用 Transform.

代码在 Java (JSFML) 中,但我认为语法相似并且任何熟悉 SFML 的人都能理解。

public class DoorTile extends Tile {

    private Transform t;

    public DoorTile() {
        ...
        t = new Transform();
        ...
        sprite.setTexture(TileTextures.DOORTEXTURE);
    }

    public void rotateAroundCenter(float degrees) {
        Vector2f center = SpriteUtils.getTextureCenter(TileTextures.DOORTEXTURE);
        t = Transform.rotate(t, degrees, center.x, center.y);
    }

    @Override
    public void draw(RenderTarget rt, RenderStates states) {
        RenderStates newStates = new RenderStates(Transform.combine(t, states.transform));
        sprite.draw(rt, newStates);
    }

getTextureCenter(Texture t) returns中心坐标t.

现在,当我应用此旋转时,我的精灵有一种奇怪的行为。起初,用45度作为测试,它们完全从屏幕上消失了。所以后来我尝试了 1 度。受影响的精灵似乎有碎片 "cut off" 并向下平移。 这是一张图片,使用 1 度作为参数:

对于上下文,我正在尝试旋转那些白色精灵(将是 'doors'),以便它们适合走廊。例如。水平在垂直 cooridors 上,垂直在水平走廊上。 (精灵的白色部分是透明度的占位符,仅用于调试目的。)

我应该怎么做才能使它正常工作?也就是说,我怎样才能:

  1. 围绕其中心旋转精灵
  2. 保持原点(左上角)

所以,问题是,我没有考虑 Transform 处理其转换的方式(即从 (0, 0))。因此,即使我尝试围绕纹理中心旋转(在本例中为 16x16 纹理),它也会围绕 (8, 8) 旋转我的所有精灵,这就是我的结果很奇怪的原因。因此,我更改了绘制函数以说明精灵的位置:

public void rotateAroundCenter(float degrees) {
    ending.vector.Vector2f center = SpriteUtils.getTextureCenter(TileTextures.DOORTEXTURE);
    ending.vector.Vector2f rotateOrigin = new ending.vector.Vector2f(sprite.getPosition()).add(center);
    transform = Transform.rotate(transform, degrees, rotateOrigin.x, rotateOrigin.y);
}

此外,我需要确保在旋转之前设置精灵的位置,因为 draw() 方法仍然认为我在 (8, 8) 上旋转它们,否则(因为精灵的默认位置是 ( 0, 0)).