1

好吧,我被难住了,我通常可以通过使用谷歌或常识找出大多数错误,但这个让我难住了!

我正在尝试将纹理加载到我的结构中的一组敌人(如太空入侵者中的一行),但是当我去调试时它会抛出一个空引用,我知道这意味着我正在尝试访问一些不是'不在那里,我相信这是因为我这样称呼:

在 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 可以设置纹理之前。它建议使用“”,但我不知道如何在这里使用它。

您可能已经猜到了引发错误的行是:

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);




    }

Targets 结构中的相关代码:

    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 应该注意的是,几乎相同的面包和奶酪结构(除了是一个精灵而不是数组)工作正常。

4

2 回答 2

2

我仍然怀疑,在 Target struct 内部你没有初始化这个 sprites[] 数组;因此,无论是在执行时sprites == null还是sprites[i]= null;

如我所见,在 Targets 上调用了三个方法,一个Targets.setupSprite(this);在 Initialize 内部调用。

Targets.loadTexture(this); Targets.scaleSprites(this);=> 这两个在 LoadContent 中被调用。

现在,正如 msdn 所述,Initialize 方法是“在创建 Game 和 GraphicsDevice 之后,但在 LoadContent 之前调用”。

如果在删除有问题的行之后(我看到你在编辑中添加的代码中做了),NullPointerException 没有与 sprites[] 数组相关,这意味着数组已初始化,但在Targets.setupSprite(this);. 如果被抛出,很可能是你根本没有初始化它。

于 2012-12-07T13:35:05.860 回答
1

异常很清楚,sprites为空。使用sprites = new Sprite[100](或您需要的任何类和大小)实例化它,您就可以开始了。

于 2012-12-07T13:33:39.187 回答