0

ここに本当の頭の体操がありますが、コードはまったく正常に見えるので、何が間違っているのかわかりません。

背景情報: 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: 不明な点があれば、この質問を編集して喜んでお知らせします。

4

0 に答える 0