这是我到目前为止所做的:
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或未定义的斜率移动。
答案 0 :(得分:2)
我怀疑它是因为你x和y是int
而你移动的距离很短,只有(1, 1)
,(1, 0)
或(0, 1)
。
您需要允许它进一步移动1,或使用更高分辨率的类型。例如双
BTW:我认为更好的选择是
,而不是使用Math.floordx = (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