ここに本当の頭の体操がありますが、コードはまったく正常に見えるので、何が間違っているのかわかりません。
背景情報: XNA/MonoGame 環境で作業を開始して約 2 日間なので、簡単なことから始めたいと思いました。私は現在、ゲームのようなアステロイド ディフェンダーを構築しており、衝突チェックに取り組んでいます。衝突に至る前に、for ループを使用してリスト内のすべての敵をループしているときに、かなり奇妙な null 参照を取得していることに気付きました。ただし、リストは別のクラスにあります。
起動時に SpawnManager クラスを初期化し、クラスが次のように作成されるとすぐに 20 の敵を作成します。
class SpawnManager
{
//Draw
ContentManager myContentManager;
//Enemies
public List<Enemy> enemy = new List<Enemy>();
public void LoadContent(ContentManager theContentManager)
{
myContentManager = theContentManager;
for (int i = 0; i < 20; i++)
{
Enemy newEnemy = new Enemy(new Vector2((800 / (20 + 1) * i + 16.5f), 20), 500, 50, 25, 10, 2500, 100, 1, 3, 2, false);
newEnemy.LoadContent(myContentManager);
enemy.Add(newEnemy);
}
}
次に、宇宙船で弾丸を発射するたびに、次のような弾丸クラスが作成されます。
public class Bullet : PlayerScript
{
//Enemy enemy;
SpawnManager spawnManager;
PlayerScript playerScript;
private Texture2D _bullet;
private Rectangle _hitBox;
public float xPos = 0;
public float yPos = 0;
public bool isActive = false;
public void LoadContent(ContentManager theContentManager)
{
_bullet = theContentManager.Load<Texture2D>("Graphics/citem");
_hitBox = new Rectangle(0, 0, _bullet.Width, _bullet.Height);
}
public void Update(GameTime gameTime)
{
//Movement.
yPos -= 13.5f;
//Collision.
for (int i = 0; i < spawnManager.enemy.Count; i++)
{
//Console.WriteLine(spawnManager.enemy.Count);
}
}
弾丸を発射するスペースを保持しているときに、すぐに null 参照エラーが発生し、for ループ部分が強調表示されます。Enemy List が null または空である可能性があるというインターネット上の投稿を読んだことがありますが、その場合でも、私のコード構造は次のようになるため、それほど重要ではありません。
Game1 Initialize -> SpawnManager の追加 -> Enemies の追加 + Enemy リストへのプッシュ。
そのため、敵が画面に表示されている場合、それらは基本的にすでに敵リストに追加されており、リストが null または空であってはなりません。
また、衝突をチェックするためのより簡単で効率的な方法はありますか? 弾丸を作成するたびに、弾丸.Updateスクリプトは、敵に到達するまで狂人のようにすべての敵をループし始め、それがどの敵であるかを確認し、変更を適用してプールに追加します。(もちろん、プールにあるときは、Bullet スクリプトを更新しません)。このアステロイド ディフェンダーは弾丸地獄のようなものなので、数秒間に 100 発の弾丸を発射すると、合計で多くのループが発生します。Unity で 1 年半過ごした後、XNA / MonoGame C# にたどり着きました。Unity ではすべてがとてもシンプルに思えます。:)
それでも、私の側では完全な ID-10-T エラーであると確信していますが、頭を包むことはできません。どんな助けも感謝します:)
PS: 不明な点があれば、この質問を編集して喜んでお知らせします。