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 上,垂直在水平走廊上。 (精灵的白色部分是透明度的占位符,仅用于调试目的。)
我应该怎么做才能使它正常工作?也就是说,我怎样才能:
- 围绕其中心旋转精灵
- 保持原点(左上角)
所以,问题是,我没有考虑 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)).
我有一个对象需要能够绕其中心旋转,但要保持原点相同(用于设置位置等)。所以,我想我需要使用 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 上,垂直在水平走廊上。 (精灵的白色部分是透明度的占位符,仅用于调试目的。)
我应该怎么做才能使它正常工作?也就是说,我怎样才能:
- 围绕其中心旋转精灵
- 保持原点(左上角)
所以,问题是,我没有考虑 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)).