2015-05-04 61 views
2

我有一个需要能够围绕其中心旋转但保持相同原点(用于设置位置等)的对象。所以,我想我需要使用一个Transform.SFML - 使用变换在其中心周围旋转一个精灵

代码是在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. 保留原来的原点(左上角)
+0

每当你去旋转一个对象周围,确保撤消它的翻译,IE它的位置。无论他们的位置在旋转时,他们都会在旋转时旋转。因此,要围绕其中心原点旋转对象,您必须将该对象的一半宽度和高度移动到世界坐标0,0之外。 – Yattabyte

回答

0

所以,问题是,我不是占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))。