Libgdx - 将物体保持在与其他物体相距一定距离和方向的位置

时间:2013-11-27 19:57:48

标签: math vector algebra

所以我想说我有两个对象。一个是圆形的精灵,另一个是三角形的精灵。 我的三角形对象在游戏的每一步都被设置为鼠标的位置,而圆圈要么站在原地,要么只是以自己的方式移动,无论如何。 我想要做的是让三角形移动到圆圈周围,但不是在它自己的周围移动,而是在光标定位的方式上移动。

所以基本上,计算圆心和三角形中心之间的度数。每当他们彼此远离时,我只是将三角形位置设置为鼠标位置,但是当你将鼠标悬停得太近(经过一些X距离)时,你无法靠近(三角形位于最大距离为X的距离)从圆心到鼠标点的方向)

我会添加一张图片,希望你能明白我的意思。 https://dl.dropboxusercontent.com/u/23334107/help2.png

1 个答案:

答案 0 :(得分:2)

步骤:

1。计算光标与圆心之间的距离。如果它超过'限制',则将三角形的位置设置为光标的位置,然后跳到步骤 4。

2。获取圆心和光标之间形成的角度。

3. 根据我们现在拥有的极坐标(角度和半径)计算三角形的新笛卡尔坐标(x,y)。在计算x和y之前,半径将设置为圆的极限,因为我们希望防止三角形进入此极限。

4. 将三角形的图像旋转到1.5708-angle,其中在步骤 2中找到角度。(1.5708,或pi / 2,以弧度为单位)相当于90°)


详细说明:

1。两点(x1, y1)(x2, y2)之间的距离为sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))

2。可以使用

计算角度(以弧度表示)
double angle = Math.atan2(circleY-cursorY, cursorX-circleX);

circleY-cursorYcursorX-circleX中看似错误的差异是大多数编程语言中坐标系的假象。 (y坐标向下增加向下而不是向上增加,就像在数学中一样,而x坐标与数学一致增加 - 向右增加。)

3. 要将极坐标转换为笛卡尔坐标,请使用以下转换:

triangle.setX( cos(angle)*limit );
triangle.setY( sin(angle)*limit );

其中limit是您希望三角形从圆圈中保留的距离。

4。为了让您的三角形“面对”圆圈(如图所示),您必须使用libgdx Sprite函数setRotation旋转它。它将围绕使用setOrigin设置的点旋转。

现在,你必须按1.5708-angle旋转 - 这是因为数学角度和编程角度之间的进一步差异! atan2函数返回数学测量的角度,3点钟0°,逆时针增加。 setRotation函数(据我所知)在十二点钟有0°并顺时针增加。此外,我们必须从弧度转换为度数。简而言之,这应该有效,但我没有测试过它:

triangle.setRotation(Math.toDegrees(1.4708-angle));

希望这有帮助!