0

我最近在尝试使用 SFML 编写包含多个精灵的类时遇到了一个轻微的问题。

我有一个包含多个精灵的容器,每个精灵都可以从容器的中心点偏移缩放、旋转和位置。但是,我在尝试旋转容器时遇到了问题。如果我只是旋转单个精灵,它不会考虑它们与容器中心的偏移(对于某些用户界面位,这是一个问题)。经过一番挖掘,我发现了如何从中心获取它们的角度并计算它们在旋转时应该最终到达的位置。但是,我不知道如何保持它们的相对旋转相同。基本上,我希望能够做到这一点

在此处输入图像描述

旋转后,它看起来像这样

在此处输入图像描述

由于 SFML 处理旋转和原点的方式,我不能只将每个精灵的原点设置为容器的中心并旋转。我需要某种函数来计算它们应该去的地方以及它们相对于它们已经拥有的方向应该具有的方向(所以如果精灵的角度为 0,当容器旋转 90 度时,它应该现在有一个 90 度的角度。虽然如果它以 90 的角度开始,之后应该旋转 180 度,以保持它相对于容器中其余精灵的旋转)

我用来获取旋转时相对于容器的位置的代码如下

float angle = atan2(p1.y -p2.y, p1.x - p2.x);
float x     = radius * cos(angle);
float y     = radius * sin(angle);

icon.set_position(x + spriteX, y + spriteY);

谢谢阅读。我从来没有那么擅长数学,所以我不知道如何自己解决这个问题。在我开始研究这个问题之前,我什至不知道 cos 和 sin 在哪里 xx 任何帮助将不胜感激。

4

2 回答 2

1

你知道如何在不移动它的位置的情况下旋转精灵吗?如果是这样,只需将实际精灵本身旋转与您在上面的圆圈上定位时所获得的角度相同的角度。现在,您使用 sin 和 cos 旋转位置。您还需要按照您计算的相同角度设置“方向”:float angle = atan2(p1.y - p2.y, p1.x - p2.x);

祝你好运!

-p黑色

于 2013-02-07T02:27:43.133 回答
0

Simple, create a vector from the container's centre point to a sprite. Then rotate the vector and you have your new sprite position.

于 2013-02-07T03:17:10.710 回答