如何将libgdx中的图像演员旋转中点?

Posted

技术标签:

【中文标题】如何将libgdx中的图像演员旋转中点?【英文标题】:How to rotate an image actor in libgdx by the middle point? 【发布时间】:2012-12-04 22:39:03 【问题描述】:

如果我理解正确,LibGDX 正在使用 addActions 方法旋转图像:

this.addAction( parallel(rotateBy(360, 0.5f), moveTo(320, 100, 0.5f)));

问题是,它正在被图像的 point=(0,0) 旋转。

这是我的问题:

有没有办法通过对象的中心点旋转图像?比如把它钉在中间,然后像汽车的***一样转动它? rotateByrotateTo 方法都将其旋转图像本身的 (0,0) 点。 p>

【问题讨论】:

【参考方案1】:

您必须正确设置演员的“原点”。您可以从 Actor API 中得知,原点是相对于位置的,用于缩放和旋转。

所以,计算你的中点,并将原点设置为中点。

Actor a;
....
a.setOrigin(a.getWidth()/2, a.getHeight()/2);

【讨论】:

这是最简单的解决方案。我只是在 roll_onto_screen() 方法中设置 Actor 内部的原点。谢谢大家! 如果我必须连续轮换演员或组怎么办? 你只需将rotateAction包装成repeatAction,然后将repeatAction设置为actors Action。【参考方案2】:

我发现设置原点的最简单和最短的方法是调用:

Actor a;

...

a.setOrigin(Align.center);

【讨论】:

【参考方案3】:

最简单的方法是平移对象,使 0,0 点为中心,旋转它,然后将其平移回原位。我不熟悉 libGDX,但应该有一种方法可以聚合三个转换,这意味着您只将一个聚合转换应用于您的对象。请记住您聚合转换的顺序会有所不同。

提供完全相同结果的更复杂的方法是计算旋转产生的偏移量并将图像平移回其原点。不要这样做。组合三个简单的转换是可行的方法,也是使用转换的最佳理由之一。

** 编辑 查看API,Actor 对象有一个 translate() 方法。使用它来移动图像,使 0,0 点位于中心。在伪代码中;

x = this.getX();
y = this.getY();
cx = this.getWidth() * .5;
cy = this.getHeight() * .5;
this.translate(-(x+cx), -(y+cy)); // move so 0,0 is the centre of the Actor object
this.rotate(thisMuch);  // rotate the Actor
this.translate((x+cx), (y+cy)); // move it back to its original location

这将导致您的对象在其中心点原地旋转。它看起来很复杂,但在实践中非常有效,如果您能够直接使用将驱动这些方法的矩阵(变换),则更是如此。

【讨论】:

moveTo(320, 100, 0.5f) 方法用于将图像移动到地图上的点 x=320 y=100。我想我不明白如何翻译对象 请记住,这是我第一次看 libGDX :-) 我正在修改上面的答案。【参考方案4】:

这是在 libgdx 中旋转演员的简单方法。

首先需要设置原点:

img.setorigin(width/2,hieght/2);

现在您可以根据需要顺时针和逆时针旋转:

img.rotate(2f);

img.rotate(-2f);

【讨论】:

以上是关于如何将libgdx中的图像演员旋转中点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在LibGDX中的表格布局中添加动画?

如何在(libgdx)阶段检测对图像透明区域的触摸?

Libgdx 之Actor 演员类

如何使用libGDX更改Scene2D图像中的纹理?

图像旋转后显示不完全

何时在 libgdx 中使用演员?啥是缺点和优点?