2011-01-05 122 views
1

我最近把HUD方法集成到了我的XNA遊戲項目中,當這個方法被主Draw方法調用時,它拋出一個對象處置異常,這與使用的兩個Drawstring有關在節目中。拋出異常對象

在spriteBatch.End()引發異常,並說無法訪問處置的對象。 對象名稱:'Texture2D'。

 //initiation of the spritebatch 
    private SpriteBatch spriteBatch; 

    //game draw method 
    public override void Draw(GameTime gameTime) 
      { 
       ScreenManager.GraphicsDevice.Clear(Color.CornflowerBlue); 

       // Our player and enemy are both actually just text strings. 
       spriteBatch = ScreenManager.SpriteBatch; 

       tileMap.Draw(spriteBatch, camera); 

       spriteBatch.Begin(SpriteSortMode.Deferred, 
        BlendState.AlphaBlend, 
        null, null, null, null, 
        camera.TransformMatrix); 

       DrawHud(); 

       level.Draw(gameTime, spriteBatch); 

       spriteBatch.End(); 

       // If the game is transitioning on or off, fade it out to black. 
       if (TransitionPosition > 0 || pauseAlpha > 0) 
       { 
        float alpha = MathHelper.Lerp(1f - TransitionAlpha, 1f, pauseAlpha/2); 

        ScreenManager.FadeBackBufferToBlack(alpha); 
       } 

       base.Draw(gameTime); 
      } 

the HUD method 
private void DrawHud() 
     { 
      Rectangle titleSafeArea = ScreenManager.GraphicsDevice.Viewport.TitleSafeArea; 
      Vector2 hudLocation = new Vector2(titleSafeArea.X + camera.Position.X, titleSafeArea.Y + camera.Position.Y); 
      Vector2 center = new Vector2(titleSafeArea.Width + camera.Position.X/2.0f, 
             titleSafeArea.Height + camera.Position.Y/2.0f); 

      // Draw time remaining. Uses modulo division to cause blinking when the 
      // player is running out of time. 
      string timeString = "TIME: " + level.TimeRemaining.Minutes.ToString("00") + ":" + level.TimeRemaining.Seconds.ToString("00"); 
      Color timeColor; 
      if (level.TimeRemaining > WarningTime || 
       level.ReachedExit || 
       (int)level.TimeRemaining.TotalSeconds % 2 == 0) 
      { 
       timeColor = Color.Yellow; 
      } 
      else 
      { 
       timeColor = Color.Red; 
      } 
      DrawShadowedString(hudFont, timeString, hudLocation, timeColor); 

      // Draw score 
      float timeHeight = hudFont.MeasureString(timeString).Y; 
      DrawShadowedString(hudFont, "SCORE: " + level.Score.ToString(), hudLocation + new Vector2(0.0f, timeHeight * 1.2f), Color.Yellow); 

     } 
     //method which draws the score and the time (and is causing the problem) 
     private void DrawShadowedString(SpriteFont font, string value, Vector2 position, Color color) 
     { 
      spriteBatch.DrawString(font, value, position + new Vector2(1.0f, 1.0f), Color.Black); 
      spriteBatch.DrawString(font, value, position, color); 
     } 
+0

在什麼行是拋出的異常? – 2011-01-05 21:06:34

+0

spriteBatch.End() – dbomb101 2011-01-05 21:17:55

回答

1

我的猜測是在level.Draw中發生了一些事情,那就是在某處放置一個紋理。它看起來並不像拉鉤方法,特別是負責

你提到雖然你確定它是由抽繩方法造成的......如果你特別評論這兩個問題,錯誤會消失嗎?

+0

拋出異常是的,當我註釋掉這兩個Drawstrings時,錯誤消失 – dbomb101 2011-01-05 21:28:06

+0

我不知道它是否與hudfont有關...你可以看看你的代碼,並確保這個資源正在加載正確,而不是卸載當你在水平之間或類似的東西? – 2011-01-05 21:31:17

+0

雖然我嘗試了另一種字體,但仍然出現錯誤 – dbomb101 2011-01-05 21:45:25

1

正如例外說的那樣,問題的存在是因爲您正在使用的Texture2D之一正在使用之前,正在使用它。

在XNA API中有兩件事情可以處理Texture2D:由內容管理器加載的任何紋理的ContentManager.Unload()方法和Texture2D.Dispose()方法。因此,請檢查您的代碼是否在任何時候調用這兩個函數中的一個。

只有當Texture2D實例「使用」時纔會拋出異常。由於SpriteBatch將紋理繪製在一起,紋理實際上並沒有被使用,直到你結束SpriteBatch(在這一點上它一次繪製所有東西)。如果更改爲SpriteSortMode.Immediate SpriteBatch將停止批處理精靈,而是將它們「立即」繪製到您要求的位置。這將導致紋理被使用,並且將調用Draw而不是End調用拋出該異常,這將更容易識別哪些紋理在仍處於使用狀態時被丟棄。

您發佈的代碼似乎很好,我懷疑問題存在於代碼中的其他地方。以上信息應該可以幫助您確定問題所在。

+0

你是對的發現問題昨天有一個卸載方法被稱爲水平類,我沒有注意到。 – dbomb101 2011-01-06 15:57:34