2015-05-04 44 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))。