好吧我很难过,我通常可以通过使用Google或常识找出大多数错误,但是这个让我感到难过!
我正在尝试将纹理加载到我的struct中的一个敌人数组(就像空间入侵者中的一行),但是当我去调试时会抛出一个Null Reference,我知道这意味着我正在尝试访问不存在的东西,我相信这是因为我称之为:
Inside Initialize我调用我的方法:
Targets.setupSprite(this);
这是struct中的实际方法:
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;
}
}
P.s应该注意的是,几乎相同的面包和奶酪结构(除了是一个精灵而不是一个数组)工作正常。
答案 0 :(得分:2)
我仍然怀疑,在Target结构中你没有初始化这个sprites []数组;
因此,在执行时sprites == null
或sprites[i]
= null;
正如我所看到的,在Targets上调用了三种方法,一种是在Initialize中调用的Targets.setupSprite(this);
。
Targets.loadTexture(this); Targets.scaleSprites(this);
=&gt;这两个在LoadContent内部调用。
现在,正如msdn所说,Initialize方法是“在创建Game和GraphicsDevice之后调用,但在LoadContent之前调用。”
如果在删除有问题的行之后(我在你在编辑中添加的代码中看到了),则不会抛出与sprites []数组相关的NullPointerException,这意味着,数组已初始化但在{{1 }}。 如果它被抛出,可能是你根本没有初始化它。
答案 1 :(得分:1)
异常非常清楚,sprites
为空。使用sprites = new Sprite[100]
(或您需要的任何类别和大小)对其进行实例化,您就可以了。