3

プロは 2D ゲームでどのように境界を設定しますか? 私が行う方法は、スプライトを特定の領域に移動させたくないと言うことです:

//Example
if ((playerPosX >= 825) && (playerPosX  <= 910)&& (playerPosY >= 170) && (playerPosY <= 255)) {
    //do nothing
}else{
    //move
}

しかし、いくつかのゲームには境界線がたくさんあるので、もっと簡単な方法はないかと考えています。動きをブロックするためだけに、誰かがゲーム全体を通して上記の方法を使用する方法はないと思います。

編集: 私の質問は主に、ポケモンやファイナル ファンタジーに似た、歩き回ることができるゲームに関するものです。

4

2 に答える 2

7

ゲームによって異なります。

  • グリッドベースのゲームでは、スプライトが「ブロックされた」領域に移動したかどうかを確認するために、スプライトが移動するたびにグリッドを参照することがよくあります。その場合は、衝突を検出するか、スプライトの修正動作を実行します。これはシンプルで効率的ですが、唯一の問題は、グリッド構造の周りにレベル/シーンを設計することを制限することです.
  • 非常に動的な環境 (移動する小惑星など) を伴うゲームでは、通常、任意のオブジェクト間の衝突を検出するために使用される空間分割 (四分木など)に基づく衝突検出システムを使用します。通常、各オブジェクトにはバウンディング ボックスがあります。
  • ベクトルで定義された複雑だが固定されたジオメトリを持つゲームでは、BSP ツリーを事前に計算し、これを使用して風景との衝突を高速に検出することができます。このテクニックは 3D FPS ゲームで一般的ですが、2D でも機能します。

多くのゲームは、実際には上記の組み合わせを使用します。たとえば、固定シーナリーには BSP ツリー、物理サブシステムによって管理される動的オブジェクトにはクワッドツリーなどです。

于 2012-12-29T08:45:27.203 に答える
0

2つの可能性が思い浮かびます。

  • 最初に、ポリゴンでブロックされた領域を記述し、ポリゴンテストでポイントを実行して、スプライトがこの位置に移動する可能性があるかどうかを判断します。

  • 2番目は、画像操作プログラムのように、ある種のマスク(レイヤー)を作成します。ここで、0ビットは移動できる位置を示し、1はブロックされた領域を示します。これは、指定された深さまで拡張できます。スプライトを部分的に非表示にするzバッファも参照してください。

編集:

if ( mask[ nextY ][ nextX ] == 0 ) {
   currX = nextX;
   currY = nextY;
}

すべての変数がintであり、maskが2dint配列であると仮定します。

于 2012-12-29T08:41:11.933 に答える