2011-01-05 3 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

На какой строке исключено исключение? –

+0

Исключение брошено на spriteBatch.End() – dbomb101

ответ

1

Я предполагаю, что что-то происходит в level.Draw, который где-то удаляет текстуру. Это не похоже на то, что метод drawhud, в частности, ответственен

Вы упомянули, что вы уверены, что это вызвано методами drawstring ... если вы прокомментируете эти два вопроса, в частности, ошибка исчезнет?

+0

Да, ошибка исчезает, когда я комментирую эти две Drawstrings – dbomb101

+0

. Интересно, имеет ли это что-то общее с hudfont ... можете ли вы просмотреть свой код и убедиться, что этот ресурс загружается правильно и не выгружается при переходе между уровнями или что-то в этом роде? –

+0

Он в значительной степени инициализирован и загружен в метод контента, как обычно, ничего не избавляет от него, хотя я и попробовал другой шрифт, но все еще получил ошибку. – dbomb101

1

Как говорится в исключении, проблема возникает из-за того, что один из используемых вами Texture2Ds находится перед его использованием.

В XNA API есть две вещи, которые будут использовать метод Texture2D: ContentManager.Unload() для любых текстур, загружаемых этим менеджером контента, и метод Texture2D.Dispose(). Поэтому проверьте, что ваш собственный код вызывает одну из этих двух функций в любой момент.

Исключение будет выдаваться только при использовании экземпляра Texture2D. Поскольку SpriteBatch объединяет текстурные рисунки, текстура фактически не используется до тех пор, пока вы не закончите SpriteBatch (в этот момент она рисует все за один раз). Если вы перейдете на SpriteSortMode.Immediate, то SpriteBatch прекратит дозирование спрайтов и вместо этого нарисует их «сразу», о которых вы просите. Это приведет к тому, что текстура будет использоваться, а исключение будет выбрано вызовом Draw вместо вызова End, что должно облегчить определение того, какая текстура удаляется во время использования.

Код, который вы опубликовали, кажется прекрасным, я подозреваю, что проблема существует в другом месте вашего кода. Вышеприведенная информация поможет вам определить, в чем проблема.

+0

Вы правильно нашли проблему, вчера был вызван метод выгрузки в классе уровня, который я не заметил. – dbomb101

Смежные вопросы