Java游戏 - 将一个对象直线移动到另一个点

时间:2012-10-22 15:25:01

标签: java game-physics

这是我到目前为止所做的:

int vx = (playerx - x);
    int vy = (playery - y);

    double distance = Math.sqrt((vx * vx) + (vy * vy));

    double doublex = ((vx / distance));
    double doubley = ((vy / distance));

    dx = (int) Math.floor(doublex + 0.5);
    dy = (int) Math.floor(doubley + 0.5);

    x += dx;
    y += dy;

我只想让x和y直接向playerx和playery移动,但它只会以0,1或未定义的斜率移动。

3 个答案:

答案 0 :(得分:2)

我怀疑它是因为你x和y是int而你移动的距离很短,只有(1, 1)(1, 0)(0, 1)

您需要允许它进一步移动1,或使用更高分辨率的类型。例如双

BTW:我认为更好的选择是

,而不是使用Math.floor
dx = (int) Math.round(doublex);

答案 1 :(得分:1)

您将水平距离和垂直距离除以总距离,这将始终产生介于1和-1之间的数字,因此每次移动时,它将无任何移动或沿方向移动1。我想这是以像素为单位的?

每次移动发生时,您应该跟踪移动的实际距离和移动的所需距离,例如,您可能尝试在每个循环中沿y轴移动0.4,并且它将永远不会移动,因为这将总是圆了下来。因此,如果在第二个循环中你知道你应该总共移动0.8,你可以向上舍入到一个,并将所需的设置保留为-0.2并保持循环。

答案 2 :(得分:0)

可以实现类似于Bresanham的线算法的解决方案。 IE:

function line(x0, y0, x1, y1)
 real deltax := x1 - x0
 real deltay := y1 - y0
 real deltaerr := abs(deltay / deltax)    // Assume deltax != 0 (line is not vertical),
       // note that this division needs to be done in a way that preserves the fractional part
 real error := deltaerr - 0.5
 int y := y0
 for x from x0 to x1 
     plot(x,y)
     error := error + deltaerr
     if error ≥ 0.5 then
         y := y + 1
         error := error - 1.0

来源:Bresanham's Line Algoithm