0

これが私がこれまでに持っているものです:

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、または未定義の勾配でのみ移動します。

4

3 に答える 3

2

あなたがxとyでありint、あなたが非常に短い距離を移動しているので、あなたは(1, 1)、、(1, 0)または(0, 1)

その1をさらに移動できるようにするか、より解像度の高いタイプを使用する必要があります。例:ダブル。

ところで:Math.floorを使用する代わりに、より良い選択は

dx = (int) Math.round(doublex);
于 2012-10-22T15:29:00.663 に答える
1

水平距離と垂直距離を合計距離で割っています。これにより、常に1から-1の数値が得られるため、移動するたびに、ある方向に何も移動しないか、1ずつ移動します。これはピクセル単位だと思いますか?

移動が発生するたびに、実際の移動距離と目的の移動距離を追跡する必要があります。たとえば、すべてのループでy軸に沿って0.4を移動しようとしている可能性があり、常に切り捨てられるため、移動することはありません。 。したがって、2番目のループで合計0.8移動する必要があることがわかっている場合は、1に切り上げて、目的のセットを-0.2のままにして、ループを続けることができます。

于 2012-10-22T15:39:47.507 に答える
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

于 2017-06-21T02:39:55.587 に答える