SFML - 使用Transform

时间:2015-05-04 06:32:12

标签: rotation sfml

我有一个物体需要能够绕其中心旋转,但保持相同的原点(用于设置位置等)。所以,我想我需要使用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)返回t的中心坐标。

现在,当我应用这个旋转时,我的精灵有一种奇怪的行为。首先,使用45度作为测试,它们完全从屏幕上消失。那么我尝试了1度。受影响的精灵似乎有碎片"切断"并向下翻译。 这是一张图片,使用1度作为参数:

Sprites affected are the little white things.

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

我该怎么做才能使这项工作正常进行?也就是说,我怎么能:

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

1 个答案:

答案 0 :(得分:0)

所以,问题在于,我没有考虑到Transform处理其变换的方式(即从(0,0)开始)。因此,即使我尝试围绕纹理的中心旋转(在这种情况下为16x16纹理),它也会旋转所有精灵(8,8),这就是为什么我的结果很奇怪。所以,我改变了我的绘制函数来考虑精灵的位置:

<testsuite>

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