我需要能够将我的播放器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(Point 2)上并移动它时,上面的代码会一直运行。但上面的代码不起作用。玩家只是朝两个方向之一移动。 player.move只是添加了velX和velY的速度。那么如何才能获得两个角度并将玩家向正确的方向移动?感谢。
答案 0 :(得分:2)
使用笛卡尔方法(向量)与极坐标方法(角度和幅度)来解决这个问题会更容易吗?因此,如果玩家位于p0
点并且“手指”位于p1
点,那么玩家应该移动v
的方向由向量p1-p0
给出。然后,您可以按照玩家的速度缩放生成的矢量v
,并将玩家的速度添加到他的位置。您可以在逐帧的基础上轻松完成此操作。
答案 1 :(得分:1)
你需要知道X轴和Y轴的速度吗?你可以在不使用三角法的情况下完成它(只需使用Pythagorean theorem)。
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);
或者你需要一个玩家在循环中移动的代码?
答案 2 :(得分:0)
删除Math.toDegrees()
。
来自Math.sin()
/ cos()
Javadoc:
参数:
返回: