1

私はここで困惑しています。通常、ほとんどのバグは Google や常識を使用して把握できますが、これには困惑しました!

構造内の敵の配列 (スペース インベーダーの行など) にテクスチャをロードしようとしていますが、デバッグに行くと Null 参照がスローされます。これは、何かにアクセスしようとしていることを意味します。そこにはありません、私はこれを呼んでいるためだと思います:

Initialize 内でメソッドを呼び出します。

Targets.setupSprite(this);

これは、構造体内からの実際のメソッドです。

  public void setupSprite(Game1 g)
        {

            widthFactor = 0.05f;
            rowSize = 15;
            spriteSpacingY = spriteRectangle.Height + 5;

            for (int i = 0; i < rowSize; i++)
            {
                if (i < 15)
                    spriteSpacing = 10;



                sprites[i].spriteTexture = g.texture;


                x = 0 + (i * spriteSpacing);
                y = spriteSpacingY;
                visible = true;

            }


        }

Content Loader でテクスチャをセットアップする前。「 new 」の使用を推奨していますが、ここでの使用方法がわかりません。

ご想像のとおり、エラーをスローする行は次のとおりです。

sprites[i].spriteTexture = g.texture;

g.textureは敵のテクスチャであり、ロード コンテンツにあります。

どんな助けでも大歓迎です!

追加コード:

 protected override void Initialize()
    {
        displayHeight = GraphicsDevice.Viewport.Height;
        displayWidth = GraphicsDevice.Viewport.Width;

        new TargetRowStruct();

            BreadBat.setupSprite(this);
            CheeseBall.setupSprite(this);
            Targets.setupSprite(this);

        base.Initialize();
    }
    protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.
        spriteBatch = new SpriteBatch(GraphicsDevice);

        texture = this.Content.Load<Texture2D>("Handsome");
        swag = this.Content.Load<Texture2D>("swag");
        back = this.Content.Load<Texture2D>("Backdrop");
        font = this.Content.Load<SpriteFont>("FontA");


        backRect.Width = (int)displayWidth;
        backRect.Height = (int)displayHeight;

        BreadBat.loadTexture(this);
        CheeseBall.loadTexture(this);
        Targets.loadTexture(this);

        BreadBat.scaleSprites(this);
        CheeseBall.scaleSprites(this);
        Targets.scaleSprites(this);




    }

ターゲット構造内の関連コード:

    public void scaleSprites(Game1 g)
        {

            for (int i = 0; i < rowSize; i++)
            {

                sprites[i].spriteRectangle.Width = (int)((g.displayWidth * sprites[i].widthFactor) + .25f);
                sprites[i].aspectRatio = (int)(sprites[i].spriteTexture.Width / sprites[i].spriteTexture.Height);
                sprites[i].spriteRectangle.Height = sprites[i].spriteRectangle.Width;
            }
        }

        public void loadTexture(Game1 g)
        {
            for (int i = 0; i < rowSize; i++)
            {                   
                sprites[i].spriteTexture = g.texture;
            }
        }

        public void drawSprite(Game1 g)
        {
            g.spriteBatch.Draw(spriteTexture, spriteRectangle, Color.White);

            for (int i = 0; i < rowSize; i++)
            {
                if (sprites[i].visible)
                {
                    g.spriteBatch.Draw(sprites[i].spriteTexture, sprites[i].spriteRectangle, Color.White);
                }
            }
        }

        public void setupSprite(Game1 g)
        {

            widthFactor = 0.05f;
            rowSize = 15;
            spriteSpacingY = spriteRectangle.Height + 5;

            for (int i = 0; i < rowSize; i++)
            {
                if (i < 15)
                    spriteSpacing = 10;






                x = 0 + (i * spriteSpacing);
                y = spriteSpacingY;
                visible = true;

            }


        }

Ps ほぼ同じ (配列ではなく 1 つのスプライトであることを除いて) パンとチーズの構造体は正常に動作することに注意してください。

4

2 に答える 2

2

私はまだ、Target struct 内でこの sprites[] 配列を初期化しないことを疑っています。したがって、実行時sprites == nullまたはsprites[i]= null;のいずれかです。

ご覧のとおり、Target で呼び出されるメソッドは 3 つあります。そのうちの 1 つはTargets.setupSprite(this);Initialize 内で呼び出されます。

Targets.loadTexture(this); Targets.scaleSprites(this);=> これら 2 つは LoadContent 内で呼び出されます。

現在、msdn が述べているように、Initialize メソッドは「Game と GraphicsDevice が作成された後、LoadContent の前に呼び出されます」。

問題のある行を削除した後 (編集で追加したコードで実行したことがわかります)、 sprites[] 配列に関連して NullPointerException がスローされない場合、配列は初期化されていますが、Targets.setupSprite(this);. スローされた場合は、おそらくまったく初期化していない可能性があります。

于 2012-12-07T13:35:05.860 に答える
1

例外はかなり明確で、spritesnull です。sprites = new Sprite[100](または必要なクラスとサイズを使用して)インスタンス化すれば、準備完了です。

于 2012-12-07T13:33:39.187 に答える