【问题标题】:How to draw a rotated Image from its center in Slick2D?如何在 Slick2D 中从其中心绘制旋转图像?
【发布时间】:2015-10-02 13:30:08
【问题描述】:

问题如下: 我有一个可以说是宇宙飞船的位置,并且必须在它的中间定义该位置(例如,由于碰撞问题等)。如果宇宙飞船不旋转,图像会这样绘制:

spaceship.draw(xPos - width/2 , yPos - height/2);

宇宙飞船现在是 Slick2D 中的图像,具有随机角度 (0

它在图像周围绘制一个椭圆(我猜可能表面积最小),然后查看距中心 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);
>       }

【问题讨论】:

  • 我不确定你的问题是什么。您想在特定位置绘制图像并旋转它吗?如果是这样,我不明白您为什么需要如此先进的概念。请问你能不能换个方式解释一下?
  • 如果您只想旋转图像,为什么旋转不适合您的需求?
  • 抱歉,请假了 6 天,我正在度假,这很棒 :-) 现在问题来了:我可以旋转图像,这很容易。但是在旋转它之后,我必须在特定位置(x,y)绘制它(旋转后的图像)。所以,我说 image.draw(x,y),但是 x 和 y 不在图像的中心,而是在中心的左上角。具体来说:在上面绘制的红点处。但我想定义旋转图像的中心,并且必须在那里绘制它。这更清楚吗?否则请告诉我!问候,r
  • 很高兴你有假期! ;) 你能发布你的代码吗?
  • 您好,先生!我想这无济于事,只要您不了解问题到底是什么。我想再解释一下,如果你理解问题,我会发布代码。问题:旋转图像的位置不是由其左上角定义的。设置旋转中心效果很好。旋转完美。什么不起作用,是按预期绘制旋转图像,因为我将其位置定义为 100,100 或其他任何值,然后左上角不在那个位置!

标签: java image slick2d image-rotation


【解决方案1】:

通过一些代码,一切都变得清晰了。

这里有一个解决方案:

@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 方法中,您必须设置旋转中心。该中心是相对于图像的,因此只需将宽度广告高度除以 2 即可获得图像中心的坐标。当它起作用时,你乘以你的规模。无需添加任何内容,因为它确实是您的图像的本地化。

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

只需将此代码调整为适合您的代码,它应该可以正常工作。询问您是否需要更高的精度。

【讨论】:

  • 您好 RPresle(以及其他寻求类似问题帮助的人)。我成功了,其实你成功了。我使用了您的代码并且它有效,但从一开始就不是完美的。有一点变化,但我可以通过在 render() 方法中涉及行中的高度来修复它(它使用宽度两次,仅适用于方形图像)。非常感谢。
  • 很高兴你知道了。我更正了我的代码,因为这显然是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2013-12-08
相关资源
最近更新 更多