字符移动,从2点获得x / y速度

时间:2016-05-26 13:10:56

标签: java math

所以我试图在java中创建一个程序,我需要弄清楚我应该添加到x和y多少,以使玩家在任何角度都能以恒定的速度移动。我有的信息是2点,一个起点和一个和我需要char以恒定速度从a移动到b。我目前正试图找出一堆不同的数学方法,但我不能正确。提前谢谢。

4 个答案:

答案 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)

数学上(我不会提供代码,对不起),假设你可以在二维平面上向任何方向移动,从我的头顶可能是这样的(取自旧学校的几何学):

  1. 速度快,让我们说每秒20像素(也可以是你选择的任何其他单位,包括游戏中的距离)
  2. 有一个轮询系统,你有2个主要变量:char的最后已知坐标(A点:Ax,Ay),最后一次已知更新的时间。
  3. 拥有当前更新的时间。
  4. 拥有目的地的坐标(B点:Bx,By)。
  5. 找出你角色的当前位置,可以这样做(不用从笛卡儿转换到极坐标系统):
  6. 找出移动角度:找到X和Y的增量(分别为Dx=Bx-AxDy=By-Ay),并使用切线查找Angle = tan-1(Dy/Dx)的角度。
  7. 计算从上次投票到当前投票的行驶距离(TD)TD = speed * elapsed time
  8. 使用正弦和余弦计算出新位置(Cx和Cy)的坐标,其中行进的X是Tx=TD*sin(Angle)并且行进Y是Ty=TD*cos(Angle)
  9. 现在将行进距离添加到原始坐标,然后获得当前位置。 Cx=Ax+TxCy=Ay+Ty
  10. 的位置

    &#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的传递。这个问题措辞不多,我很遗憾浪费时间。