1

私は XNA プラットフォームのゲームに取り組んでおり、衝突の助けが必要です。ゲームは洞窟で行われますが、問題はアート スタイルが大ざっぱで、地形 (洞窟) が大きく異なるため、タイルを使用できないことです。しかし、キャラクターと洞窟のピクセル パーフェクト コリジョンをチェックする必要がありますが、すべてのタイルの周りに四角形を配置できないため、その方法がわかりません。

私はそれについて多くのことを考えてきましたが、いくつかのアイデアを思いつきました:

- レベル全体とキャラクターの周りに 1 つの大きな長方形があり、ピクセル パーフェクト コリジョンを使用します。しかし、長方形には背景も含まれるため、うまくいかないと思います。

-長方形を手動で配置します。非常に醜いコードで、多くのバグやエラーが発生する可能性があります。

-とにかくタイルを使用し、何百ものタイルの種類があります。繰り返しますが、非常に醜いコードで、間違っているようです。

・衝突エンジンを使用。私はできればゼロからゲームを作りたいと思います。

説明が下手で申し訳ありませんが、かなり複雑な問題であり(少なくとも私にとっては)、ネット上で解決策を見つけることができません。どんなアイデアでもとてもうれしいです、ありがとう。

4

1 に答える 1

5

やろうとしていることを行うには、ピクセルごとの衝突検出を使用する必要があると思います。alphaキャラクターを作成し、実際のキャラクターを除いて、(画像の を使用して) テクスチャを透明にすることができます。次にterrain、洞窟となるテクスチャを作成できます。キャラクターが移動できる洞窟の部分を透明にして、レベル全体の背景となる別のテクスチャを使用できるようにします。大まかな例を次に示します。

キャラクター(ピンク色のBGは透明です:)

ここに画像の説明を入力

洞窟(白は透明)

ここに画像の説明を入力

バックグラウンド:

ここに画像の説明を入力

3 つすべてを合計すると、次のようになります。

ここに画像の説明を入力

これは、非常に大まかなアイデアを提供するためのものです (背景をググって、洞窟をペイントで描いたからです)。次に、洞窟のテクスチャ (洞窟の背景ではない) とキャラクターのテクスチャの間でアルファ ピクセルの衝突検出を使用できます。ピクセルごとのコリジョンを簡単に使用する方法については、こちらのチュートリアルを参照してください。HTH。使用できる衝突コードを次に示します (rectangleA文字の四角形、dataA文字のピクセル データ、rectangleB洞窟の四角形 (おそらく画面全体)、およびdataB洞窟のピクセル データ (背景ではありません) である必要があります)。背景画像のピクセル データを使用していない場合、衝突はこのデータではチェックされません。

    /// <param name="rectangleA">Bounding rectangle of the first sprite</param>
    /// <param name="dataA">Pixel data of the first sprite</param>
    /// <param name="rectangleB">Bouding rectangle of the second sprite</param>
    /// <param name="dataB">Pixel data of the second sprite</param>
    /// <returns>True if non-transparent pixels overlap; false otherwise</returns>
    static bool IntersectPixels(Rectangle rectangleA, Color[] dataA,
                                Rectangle rectangleB, Color[] dataB)
    {
        // Find the bounds of the rectangle intersection
        int top = Math.Max(rectangleA.Top, rectangleB.Top);
        int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom);
        int left = Math.Max(rectangleA.Left, rectangleB.Left);
        int right = Math.Min(rectangleA.Right, rectangleB.Right);

        // Check every point within the intersection bounds
        for (int y = top; y < bottom; y++)
        {
            for (int x = left; x < right; x++)
            {
                // Get the color of both pixels at this point
                Color colorA = dataA[(x - rectangleA.Left) +
                                     (y - rectangleA.Top) * rectangleA.Width];
                Color colorB = dataB[(x - rectangleB.Left) +
                                     (y - rectangleB.Top) * rectangleB.Width];

                // If both pixels are not completely transparent,
                if (colorA.A != 0 && colorB.A != 0)
                {
                    // then an intersection has been found
                    return true;
                }
            }
        }

        // No intersection found
        return false;
    }
于 2014-02-15T14:32:36.730 に答える