0

Game1とAnimationの2つのクラスがあります。「オブジェクト参照がオブジェクトのインスタンスに設定されていない」というメッセージが常に表示されます。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); 
    } 
}
4

4 に答える 4

1

フィールドanimationが初期化されておらず、そのインスタンスメソッドを呼び出してDrawいるため、この例外が発生します。その特定の行では、それはnullです。updateメソッドで初期化されています。例外を回避するために、コンストラクターで初期化できます。

于 2012-09-11T09:51:52.437 に答える
0

Update-classの-methodがそのクラスの-methodのGame1前に呼び出されていることを確認するか、そのメンバーを呼び出す前に呼び出されていないことを確認してください。Drawanimationnull

protected override void Draw(GameTime gameTime) 
{ 
    if (animation != null)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue); 
        spriteBatch.Begin(); 
        animation.Draw(spriteBatch);    
        spriteBatch.End(); 
    }
    base.Draw(gameTime); 
} 
于 2012-09-11T09:52:12.250 に答える
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メソッドにロジックを追加してnull値をチェックする必要があります。

于 2012-09-11T09:53:25.383 に答える
0

animation = new Animation(gegnerbilder, gegner, TimeSpan.FromSeconds(3));

あなたは本当に新しいアニメーションを作成し、それを毎回更新していますか?Update()それは毎秒60回になる可能性があります。

メソッドに追加する必要がありますInitialize()(またはアニメーションを変更する必要があるときはいつでも)

その後、updateでもanimation.Update()を実行できますが、コンストラクターは使用できません。

于 2012-09-11T11:59:02.360 に答える