4

ゲームの小惑星はトーラスの表面でプレイされます。

4

5 に答える 5

7

画面のどの端でも折り返すことができるので、小惑星と船の間には常に4本の直線があります(上下、上下、上下、左右)。それぞれの長さを計算して、最小の結果を取得します。

int dx1 = abs(ship_x - asteroid_x);
int dx2 = screen_width - dx1;

int dy1 = abs(ship_y - asertoid_y);
int dy2 = screen_height - dy1;

// Now calculate the psuedo-distances as Pete suggests:
int psuedo1 = (dx1 * dx1) + (dy1 * dy1);
int psuedo2 = (dx2 * dx2) + (dy1 * dy1);
int psuedo3 = (dx1 * dx1) + (dy2 * dy2);
int psuedo4 = (dx2 * dx2) + (dy2 * dy2);

これは、関係するさまざまな距離を計算する方法を示しています。それぞれを適切な方向にマッピングすることには、少し複雑な点があります。

于 2013-01-17T22:09:50.510 に答える
4

A*検索アルゴリズムをお勧めします

于 2013-01-17T22:08:20.920 に答える
1

船を基準にして球を見つけます。

私の例では小数を避けるため。x&y = [0 ... 511]の範囲とします。ここで、ラップすると511==0になります。

真ん中を原点にしましょう。

したがって、球と船の位置の両方からvec2(256,256)を引きます

sphere.position(-255,255)= sphere.position(1-256、511-256);

ship.position(255、-255)= ship.position(511-256、1-256)

firstDistance(-510,510)= sphere.position(-255,255)-ship.position(255、-255)

wrappedPosition(254、-254)= wrapNewPositionToScreenBounds(firstDistance(-510,510))//原点オフセット256を使用したアンダーフロー/オーバーフロー

secondDistance(1、-1)= ship.position(255、-255)-wrappedPosition(254、-254)

于 2013-01-17T22:15:06.060 に答える
1
#include <iostream>

template<typename Scalar>
struct vector2d {
  Scalar x;
  Scalar y;
};
template<typename Scalar>
struct position2d {
  Scalar x;
  Scalar y;
};

template<typename S>
S absolute( S in ) {
  if (in < S())
    return -in;
  return in;
}

template<typename S>
S ShortestPathScalar( S ship, S rock, S wrap ) {
  S direct = rock-ship;
  S indirect = (wrap-ship) + (rock);
  if (absolute( direct ) > absolute( indirect ) ) {
    return indirect;
  }
  return direct;
}

template<typename S>
vector2d<S> ShortestPath( position2d<S> ship, position2d<S> rock, position2d<S> wrap ) {
  vector2d<S> retval;
  retval.x = ShortestPathScalar( ship.x, rock.x, wrap.x );
  retval.y = ShortestPathScalar( ship.y, rock.y, wrap.y );
  return retval;
}


int main() {
  position2d<int> world = {1000, 1000};
  position2d<int> rock = {10, 10};
  position2d<int> ship = {500, 900};
  vector2d<int> path = ShortestPath( ship, rock, world );
  std::cout << "(" << path.x << "," << path.y << ")\n";
}

そのような単純な宇宙で二乗することでがらくたをすることには意味がありません。

Scalarをサポートするすべてのタイプのサポートa < b、およびゼロのデフォルトの構造。doubleまたはintのようにlong long

上記のコードをコピーして貼り付け、その問題で遊んでいるレベルで割り当てとして渡すと、奇妙に見えることに注意してください。ただし、アルゴリズムは非常に簡単に理解できるはずです。

于 2013-01-17T22:56:36.873 に答える
1

小惑星への最小の道が必要な場合は、小惑星までの実際の最小距離を計算する必要はありません。私があなたを正しく理解しているなら、あなたは最短経路の長さではなく最短経路を必要とします。

これは、計算上最も安価な方法だと思います。

隕石の位置を(Mx、My)、船の位置を(Sx、Sy)とします。ビューポートの幅はW、高さはHです。

dx = Mx-Sx、dy=My-Sy。

abs(dx)> W / 2(この場合は256)の場合、船は左に移動する必要があり、abs(dx)<W / 2の場合、船は右に移動する必要があります。重要-dxが負の場合、結果を反転します。(これを指摘してくれた@Toadに感謝します!)

同様に、abs(dy)> H / 2船が上がると、abs(dy)<H/2船が下になります。dxと同様に、dyが-veの場合は、結果を反転します。

これはラッピングを考慮に入れており、すべての場合に機能するはずです。正方形やピタゴラスの定理は含まれていません。もっと安くできるとは思えません。また、実際の最短距離を見つける必要がある場合は、今一度だけ適用する必要があります(4つの可能なパスのどれをとる必要があるかがすでにわかっているため)。@Peterの投稿は、ラッピングを考慮しながらそれを行うためのエレガントな方法を提供します。

于 2013-01-18T09:27:16.170 に答える