对象处理异常被抛出

时间:2011-01-05 21:02:53

标签: c#-4.0 xna

我最近将HUD方法集成到我的XNA游戏项目中,当主方法调用该方法时,它会抛出一个对象处理异常,这与程序中使用的两个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);
        }

2 个答案:

答案 0 :(得分:1)

我的猜测是在某个地方发生了一些事情。在某处处理纹理。它看起来并不像drawhud方法特别负责

你提到虽然你确定它是由抽绳方法引起的...如果你特别评论那两个错误会消失吗?

答案 1 :(得分:1)

正如例外所述,问题的存在是因为您使用的其中一个Texture2D在使用之前就被处理掉了。

XNA API中有两件事(我们会想到)会处理一个Texture2D:该内容管理器加载的任何纹理的ContentManager.Unload()方法,以及Texture2D.Dispose()方法。因此,请检查您自己的代码是否在任何时候调用这两个函数中的一个。

只有在“使用”Texture2D实例时才会抛出异常。因为SpriteBatch将纹理绘制一起批处理,所以在你结束SpriteBatch之前实际上不会使用纹理(此时它会一次性绘制所有内容)。如果您更改为SpriteSortMode.Immediate SpriteBatch将停止批处理精灵,而是“立即”将它们绘制出来,你会问它。这将导致使用纹理,并在Draw调用而不是End调用时抛出异常,这样可以更容易地识别在使用时正在处理哪个纹理。

您发布的代码似乎没问题,我怀疑代码中的其他地方存在问题。以上信息可以帮助您确定问题所在。