如何在 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方法中,您必须设置旋转中心。这个中心是相对于图像的,所以只需将宽度和高度除以二即可得到图像中心的坐标。当它工作时,你乘以你的规模。没有什么要添加的,因为它对您的图像来说真的是本地化的。

在渲染方法中,绘制图像总是从左上角开始。只需减去一半宽度和一半高度即可设置使用您的中心。

只需根据您的代码调整此代码,它就会正常运行。询问您是否需要更高的精度。