如何在 Slick2D 中从其中心绘制旋转图像?
How to draw a rotated Image from its center in Slick2D?
问题如下:
我有一个位置,可以说是一艘宇宙飞船,必须在它的中间定义位置(例如,由于碰撞问题等)。如果宇宙飞船不旋转,图像会画成这样:
spaceship.draw(xPos - width/2 , yPos - height/2);
宇宙飞船现在是 Slick2D 中的图像,具有随机角度(0 <= 角度 <360),并且仍然必须在其中心定义位置。 slick 在 draw() 方法中的作用如下:
它在图像周围画了一个椭圆(我猜是用尽可能小的表面积),然后查看从中心以 135° 偏离的线在哪里切割椭圆(红点)并将其设置为位置。
我仍然想把它画在中间,也就是说,我必须在两个维度上减去一个值 (draw(xPos - xOff, yPos - yOff)
):
但是我无法计算!有谁可以帮助我吗?我浪费了两天才明白问题是什么...
非常感谢和问候,
r
这里是渲染代码:
> public void render(GameContainer gc, StateBasedGame sbg, Graphics g)
> throws SlickException{
>
> // This sets all rotation to the middle of the graphics.
> // The method works RELATIVE TO THE TOP-LEFT-CORNER OF THE IMAGE.
> skin.setCenterOfRotation(skin.getWidth() * Revolve.getGS()/2 + Revolve.getXShift(),
> skin.getHeight() * Revolve.getGS()/2 + Revolve.getYShift());
>
> // This sets the Angle properly
> skin.setRotation(angle);
>
> // This draws the image: xPos and yPos define THE CENTER of the Image.
> skin.draw(
> (float) (Revolve.getXShift() + Revolve.getGS() * xPos),
> (float) (Revolve.getYShift() + Revolve.getGS() * yPos),
> Revolve.getGS()
> );
>
> // Draws the xPos and yPos of the Ship
> g.setColor(Color.white);
> g.drawOval(Revolve.getXShift() + Revolve.getGS() * xPos, Revolve.getYShift() + Revolve.getGS() * yPos, 2, 2);
> }
有了一些代码,一切都会变得清晰。
这是一个解决方案:
@Override
public void init(GameContainer container) throws SlickException
{
this.character = new Image("/home/ronan/Images/20150517010612.jpg");
this.scale = 0.5f;
// When you set your center of rotation is is relative to your image ONLY.
// this will make the center of my image to be the center of the rotation
// NOTHING more to add
this.character.setCenterOfRotation((this.character.getWidth()/2)*this.scale, (this.character.getHeight()/2)*this.scale);
}
@Override
public void update(GameContainer container, int delta) throws SlickException
{
this.rotation +=delta/10;
this.character.setRotation(this.rotation);
}
public void render(GameContainer container, Graphics g) throws SlickException
{
// Here I consider that my position is (500,500). then to draw it, I just substract hal the size of my image.
// It will draw from top-lefft corner but based on my center.
character.draw(500-(this.character.getWidth()/2)*this.scale, 500 - (this.character.getHeight()/2)*this.scale,this.scale);
}
为了清楚起见,我把所有东西都分开了。
在init
方法中,您必须设置旋转中心。这个中心是相对于图像的,所以只需将宽度和高度除以二即可得到图像中心的坐标。当它工作时,你乘以你的规模。没有什么要添加的,因为它对您的图像来说真的是本地化的。
在渲染方法中,绘制图像总是从左上角开始。只需减去一半宽度和一半高度即可设置使用您的中心。
只需根据您的代码调整此代码,它就会正常运行。询问您是否需要更高的精度。
问题如下: 我有一个位置,可以说是一艘宇宙飞船,必须在它的中间定义位置(例如,由于碰撞问题等)。如果宇宙飞船不旋转,图像会画成这样:
spaceship.draw(xPos - width/2 , yPos - height/2);
宇宙飞船现在是 Slick2D 中的图像,具有随机角度(0 <= 角度 <360),并且仍然必须在其中心定义位置。 slick 在 draw() 方法中的作用如下:
我仍然想把它画在中间,也就是说,我必须在两个维度上减去一个值 (draw(xPos - xOff, yPos - yOff)
):
但是我无法计算!有谁可以帮助我吗?我浪费了两天才明白问题是什么...
非常感谢和问候, r
这里是渲染代码:
> public void render(GameContainer gc, StateBasedGame sbg, Graphics g)
> throws SlickException{
>
> // This sets all rotation to the middle of the graphics.
> // The method works RELATIVE TO THE TOP-LEFT-CORNER OF THE IMAGE.
> skin.setCenterOfRotation(skin.getWidth() * Revolve.getGS()/2 + Revolve.getXShift(),
> skin.getHeight() * Revolve.getGS()/2 + Revolve.getYShift());
>
> // This sets the Angle properly
> skin.setRotation(angle);
>
> // This draws the image: xPos and yPos define THE CENTER of the Image.
> skin.draw(
> (float) (Revolve.getXShift() + Revolve.getGS() * xPos),
> (float) (Revolve.getYShift() + Revolve.getGS() * yPos),
> Revolve.getGS()
> );
>
> // Draws the xPos and yPos of the Ship
> g.setColor(Color.white);
> g.drawOval(Revolve.getXShift() + Revolve.getGS() * xPos, Revolve.getYShift() + Revolve.getGS() * yPos, 2, 2);
> }
有了一些代码,一切都会变得清晰。
这是一个解决方案:
@Override
public void init(GameContainer container) throws SlickException
{
this.character = new Image("/home/ronan/Images/20150517010612.jpg");
this.scale = 0.5f;
// When you set your center of rotation is is relative to your image ONLY.
// this will make the center of my image to be the center of the rotation
// NOTHING more to add
this.character.setCenterOfRotation((this.character.getWidth()/2)*this.scale, (this.character.getHeight()/2)*this.scale);
}
@Override
public void update(GameContainer container, int delta) throws SlickException
{
this.rotation +=delta/10;
this.character.setRotation(this.rotation);
}
public void render(GameContainer container, Graphics g) throws SlickException
{
// Here I consider that my position is (500,500). then to draw it, I just substract hal the size of my image.
// It will draw from top-lefft corner but based on my center.
character.draw(500-(this.character.getWidth()/2)*this.scale, 500 - (this.character.getHeight()/2)*this.scale,this.scale);
}
为了清楚起见,我把所有东西都分开了。
在init
方法中,您必须设置旋转中心。这个中心是相对于图像的,所以只需将宽度和高度除以二即可得到图像中心的坐标。当它工作时,你乘以你的规模。没有什么要添加的,因为它对您的图像来说真的是本地化的。
在渲染方法中,绘制图像总是从左上角开始。只需减去一半宽度和一半高度即可设置使用您的中心。
只需根据您的代码调整此代码,它就会正常运行。询问您是否需要更高的精度。