1

私はある種の弾幕ゲームをプログラミングしていて、衝突を検出するコードを作成しました。実際に動作しますが、これを行う簡単な方法があると思います。説明させてください。

コードには、Player クラスと Enemy クラスのインスタンスを作成する GameScreen があります。

その敵クラスは弾丸パターン クラスのインスタンスを作成し、弾丸パターンは弾丸をインスタンス化するクラスです。敵のクラスでそれらを生成しない理由は、1 つの敵が複数のパターンを持つ可能性があるためです。

したがって、Bullet Pattern クラスは、画面上の箇条書きのリストを含むクラスです。そのため、衝突をチェックするために、GameScreen には、プレイヤーの位置 (およびコライダーの半径) を取得し、敵との衝突チェックを呼び出すメソッドがあり、敵と衝突していない場合は、弾丸との衝突をチェックするパターン。

GameScreen CheckCollision:

private void CheckCollision()
{
    Vector2 playerPos = player.GetPosition();
    float colSize = player.GetColliderSize();
    bool isColliding = testEnemy.CheckCollision(playerPos, colSize);
    if (isColliding) //If collides, the player do what it should do.
    {
        player.Collide();
    }
}

Enemy CheckCollision は、敵と衝突しているかどうかをチェックし、衝突していない場合はパターン メソッドを呼び出します。

    public bool CheckCollision(Vector2 playerPos, float colSize)
    {
        float distance = Game1.DistanceBetween(playerPos, position);
        float minDistance = colSize + colliderSize;
        bool collision = distance <= minDistance;
        if (collision)
        {
            return collision;
        }
        collision = patterns[actualPattern].CheckCollision(playerPos, colSize);
        return collision;
    }

パターン CheckCollision:

    public bool CheckCollision(Vector2 playerPos, float colSize)
    {
        //The pattern can have Sub Patterns, wich is the same pattern class...
        for (byte i = 0; i < subPatterns.Count; i++)
        {
            subPatterns[i].CheckCollision(playerPos, colSize);
        }
        for (int i = 0; i < bullets.Count; i++)
        {
            Vector2 bulletPos = bullets[i].GetPosition();
            float bulletSize = bullets[i].GetColliderSize();
            float distance = Game1.DistanceBetween(playerPos, bullets[i].position);
            float minDistance = colSize + bulletSize;
            if (distance <= minDistance)
            {
                return true;
                break;
            }
        }
        return false;
    }

私が言ったように、それは実際に機能しますが、それを行うためのより簡単な方法があることを私は知っています...したがって、質問は実際には2つです:

  1. その衝突チェックを行う簡単な方法はありますか?
  2. GameScreen がパターンから Bullet List に直接アクセスする方法はありますか?
4

1 に答える 1

2

各ゲーム オブジェクトをループせずに衝突を検出する方法はたくさんあります。

  1. 四分木 ( http://en.wikipedia.org/wiki/Quadtree )
  2. ゲームがグリッドに分割されているグリッド ベースの衝突チェック。全体の衝突検出は、さまざまなグリッドを反復することによって行われます。

私が知らない他の方法があります。それとは別に、特に弾丸は動きの速いオブジェクトであるため、弾丸を扱う場合は、衝突検出がcontinuousまたはであるかどうかを判断する必要もあります。discrete

GameScreen がこれらの弾丸にアクセスする方法については、ゲーム内のすべてのオブジェクトを追跡する GameObjectManager を使用します。そのクラスをシングルトン インスタンスとしてゲーム レジストリ内に保持して、定期的な更新が必要な要素を簡単に追跡できるようにします。

于 2013-04-15T02:06:25.710 に答える