我有两个类:Game1和Animation。 我总是得到“对象引用未设置为对象的实例”。 Game1类的这一行中的错误信息:animation.Draw(spriteBatch); 怎么了?我不知道该改变什么。
Animation class code:
public class Animation
{
private int _animIndex;
public TimeSpan PassedTime { get; private set; }
public Rectangle[] SourceRects { get; private set; }
public Texture2D Texture {get; private set; }
public TimeSpan Duration { get; private set; }
public Animation(Rectangle[] sourceRects, Texture2D texture, TimeSpan duration)
{
for (int i = 0; i < sourceRects.Length; i++)
{
sourceRects[i] = new Rectangle((sourceRects.Length - 1 - i) * (Texture.Width / sourceRects.Length), 0, Texture.Width / sourceRects.Length, Texture.Height);
}
SourceRects = sourceRects;
Texture = texture;
Duration = duration;
}
public void Update(GameTime dt)
{
PassedTime += dt.ElapsedGameTime;
if (PassedTime > Duration)
{
PassedTime -= Duration; // zurücksetzen
}
var percent = PassedTime.TotalSeconds / Duration.TotalSeconds;
_animIndex = (int)Math.Round(percent * (SourceRects.Length - 1));
}
public void Draw(SpriteBatch batch)
{
batch.Draw(Texture, new Rectangle(0, 0, Texture.Width / SourceRects.Length, Texture.Height), SourceRects[_animIndex], Color.White);
}
}
Game1 class code:
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Animation animation;
Texture2D gegner;
Rectangle[] gegnerbilder = new Rectangle[10];
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
gegner = Content.Load<Texture2D>("kurzeanim");
}
protected override void Update(GameTime gameTime)
{
KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.A))
{
animation = new Animation(gegnerbilder, gegner, TimeSpan.FromSeconds(3));
animation.Update(gameTime);
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
animation.Draw(spriteBatch);
spriteBatch.End();
base.Draw(gameTime);
}
}
答案 0 :(得分:1)
您的字段animation
未初始化,并且您正在调用其实例方法Draw
,这就是您获得此异常的原因。在该特定行,它为空。它正在update方法中初始化,您可以在构造函数中初始化它以避免该异常
答案 1 :(得分:0)
确保在该类的Update
- 方法之前调用Game1
- 类的Draw
- 方法,或确保animation
不是null
在调用其成员之前:
protected override void Draw(GameTime gameTime)
{
if (animation != null)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
animation.Draw(spriteBatch);
spriteBatch.End();
}
base.Draw(gameTime);
}
答案 2 :(得分:0)
如果在调用Update时按下A键,则只会实例化动画属性。
protected override void Update(GameTime gameTime)
{
KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.A))
{
animation = new Animation(gegnerbilder, gegner, TimeSpan.FromSeconds(3));
animation.Update(gameTime);
}
base.Update(gameTime);
}
您需要提前初始化它(例如在构造函数中)或向Draw方法添加一些逻辑以检查空值。
答案 3 :(得分:0)
animation = new Animation(gegnerbilder, gegner, TimeSpan.FromSeconds(3));
您是否真的创建了一个新动画,并且每Update()
更新一次这可能是每秒60次。
您需要将其添加到Initialize()
方法(或者您需要更改动画时)
然后在更新中你仍然可以做animation.Update()但没有构造函数。