私はある種の弾幕ゲームをプログラミングしていて、衝突を検出するコードを作成しました。実際に動作しますが、これを行う簡単な方法があると思います。説明させてください。
コードには、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つです:
- その衝突チェックを行う簡単な方法はありますか?
- GameScreen がパターンから Bullet List に直接アクセスする方法はありますか?