2

我需要能够以与点到点相同的方向移动我的玩家 x 和 y 像素。很难解释,但这就是我想要做的:

在此处输入图像描述

角度 1 和 2 必须相同。点 1 在 (100, 100) 处保持不变,但点 2 不断变化,角度也必须如此。我试过这个:

moveRectangle.setX(touchEvent.getX());
moveRectangle.setY(touchEvent.getY());
float theta = (float) Math.toDegrees(Math.atan2(touchEvent.getY() - 100,touchEvent.getY() - 100));
float velX = (float) (getSpeed() * Math.cos(theta));
float velY = (float) (getSpeed() * Math.sin(theta));
player.move(velX, velY);

当用户将手指放在 moveRectangle(点 2)上并移动它时,上面的代码会不断运行。但是上面的代码不起作用。玩家只是朝两个方向之一移动。player.move 只是添加了 velX 和 velY 速度。那么如何获得这两个角度并将玩家移动到正确的方向呢?谢谢。

4

3 回答 3

2

使用笛卡尔方法(向量)与极坐标方法(角度和幅度)相比,解决这个问题会更容易吗?因此,如果玩家在 pointp0并且“手指”在 point p1,那么玩家应该移动的方向v由向量 给出p1-p0。然后,您可以v按玩家的速度缩放生成的向量,并将玩家的速度添加到他的位置。您可以逐帧轻松地执行此操作。

于 2013-04-28T20:59:03.073 回答
1

您只需要知道 X 和 Y 轴上的速度吗?您可以在不使用三角函数的情况下做到这一点(只需使用勾股定理)。

final float deltaX = touchEvent.getX() - player.x; // player.x is point1.x
final float deltaY = touchEvent.getY() - player.y; // player.y is point1.y
final float length = Maths.sqrt((deltaX)^2 + (deltaY)^2);
final float itterations = length / getSpeed();
final float velX = deltaX / itterations;
final float velY = deltaY / itterations;
player.move(velX, velY);

或者你需要一个循环移动的玩家代码?

于 2013-04-28T21:12:43.293 回答
0

删除Math.toDegrees().

来自Math.sin()/ cos()Javadoc:

参数:

  • a - 一个角度,以弧度为单位。

回报:

  • 论证的正弦。
于 2013-04-28T21:01:18.423 回答