所以我试图在java中创建一个程序,我需要弄清楚我应该添加到x和y多少,以使玩家在任何角度都能以恒定的速度移动。我有的信息是2点,一个起点和一个和我需要char以恒定速度从a移动到b。我目前正试图找出一堆不同的数学方法,但我不能正确。提前谢谢。
答案 0 :(得分:2)
实际上非常简单。您有点A (A.x, A.y)
和B (B.x, B.y)
,需要更新您的角色位置。
首先计算方向向量dir = B - A
(按组件减去,使dir.x = B.x - A.x; dir.y = B.y - A.y
)。
如果你将整个矢量添加到角色的位置,你将按sqrt(dir.x^2 + dir.y^2)
(毕达哥拉斯定理)移动它。因此,速度将是:speed = sqrt(dir.x^2 + dir.y^2) / frameTime
。
因此,如果你想要一个恒定的速度,你必须找到方向向量的倍数。这将是:
update = dir * speed / sqrt(dir.x^2 + dir.y^2) * frameTime
characterPosition = characterPosition + update
不要为角度计算烦恼。矢量算法通常更具鲁棒性和表现力。
答案 1 :(得分:0)
由于你没有提供我们的代码,我可以猜猜你究竟在尝试什么。 所以我将从一些基础开始。 我想你不只是想做一个程序 但基于2D的游戏引擎的基本运动。
然而,持续移动是基于更新方法 在渲染时读取播放器输入大约30次。 我的项目示例:
public void run() {
boolean isRunning = true;
long lastNanoTime = System.nanoTime(),nowNanoTime = System.nanoTime();
final double secondAsNano = 1000000000.0;
final double sixtiethOfSecondAsNano = secondAsNano / 30.0;
int delta = 1;
while(isRunning){
nowNanoTime = System.nanoTime();
if(delta * sixtiethOfSecondAsNano + lastNanoTime < nowNanoTime){
update();
delta++;
if(delta == 30){
delta = 1;
lastNanoTime = nowNanoTime;
}
}
render();
}
}
public update(){
if(Input.moveUP) setPlayerY(getPlayerY() - 0.2);
if(Input.moveDOWN) setPlayerY(getPlayerY() + 0.2);
if(Input.moveRIGHT) setPlayerX(getPlayerX() + 0.2);
if(Input.moveLEFT) setPlayerX(getPlayerX() - 0.2);
}
我只是将其剪切为易读,因此它可能无法正常工作,但它应该向您解释它基本上是如何完成的。
答案 2 :(得分:0)
数学上(我不会提供代码,对不起),假设你可以在二维平面上向任何方向移动,从我的头顶可能是这样的(取自旧学校的几何学):
Dx=Bx-Ax
和Dy=By-Ay
),并使用切线查找Angle = tan-1(Dy/Dx)
的角度。TD = speed * elapsed time
Tx=TD*sin(Angle)
并且行进Y是Ty=TD*cos(Angle)
。Cx=Ax+Tx
和Cy=Ay+Ty
。&#34;顺利&#34;运动在很大程度上取决于你的投票质量,并且在某种程度上也取决于小距离的舍入。
答案 3 :(得分:0)
我在发布此消息后差不多一个小时就把这个弄清楚了。对不起,我的问题是如此模糊,我正在寻找的是我试图做的不是代码本身的数学,但感谢回答的人。这是我在代码中提出的解决方案:
if (q.get(0)[0][0] > q.get(0)[1][0]) {
if(q.get(0)[0][0] == q.get(0)[1][0]) {
currentLocation[0] -= 5 * Math.cos((Math.atan(((double) q.get(0)[0][1] - (double) q.get(0)[1][1]) / ((double) q.get(0)[0][0] - (double) q.get(0)[1][0]))));
currentLocation[1] += 5 * Math.sin((Math.atan(((double) q.get(0)[0][1] - (double) q.get(0)[1][1]) / ((double) q.get(0)[0][0] - (double) q.get(0)[1][0]))));
}
else{
currentLocation[0] -= 5 * Math.cos((Math.atan(((double) q.get(0)[0][1] - (double) q.get(0)[1][1]) / ((double) q.get(0)[0][0] - (double) q.get(0)[1][0]))));
currentLocation[1] -= 5 * Math.sin((Math.atan(((double) q.get(0)[0][1] - (double) q.get(0)[1][1]) / ((double) q.get(0)[0][0] - (double) q.get(0)[1][0]))));
}
} else {
if(q.get(0)[0][0] == q.get(0)[1][0]) {
currentLocation[0] += 5 * Math.cos((Math.atan(((double) q.get(0)[0][1] - (double) q.get(0)[1][1]) / ((double) q.get(0)[0][0] - (double) q.get(0)[1][0]))));
currentLocation[1] -= 5 * Math.sin((Math.atan(((double) q.get(0)[0][1] - (double) q.get(0)[1][1]) / ((double) q.get(0)[0][0] - (double) q.get(0)[1][0]))));
}
else{
currentLocation[0] += 5 * Math.cos((Math.atan(((double) q.get(0)[0][1] - (double) q.get(0)[1][1]) / ((double) q.get(0)[0][0] - (double) q.get(0)[1][0]))));
currentLocation[1] += 5 * Math.sin((Math.atan(((double) q.get(0)[0][1] - (double) q.get(0)[1][1]) / ((double) q.get(0)[0][0] - (double) q.get(0)[1][0]))));
}
}
我想出了一种获得我想要的结果的方法,尽管我可能过度复杂了。 q是一个ArrayList,它包含2d2 [a / b] [x / y]的2d数组。和currentLocation一个2索引数组只是[x / y]。结果是我想要的效果,它以(X单位)绘制一条线,以相同的速度在任何方向上从点a到b的传递。这个问题措辞不多,我很遗憾浪费时间。