我最近将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);
}
答案 0 :(得分:1)
我的猜测是在某个地方发生了一些事情。在某处处理纹理。它看起来并不像drawhud方法特别负责
你提到虽然你确定它是由抽绳方法引起的...如果你特别评论那两个错误会消失吗?
答案 1 :(得分:1)
正如例外所述,问题的存在是因为您使用的其中一个Texture2D在使用之前就被处理掉了。
XNA API中有两件事(我们会想到)会处理一个Texture2D:该内容管理器加载的任何纹理的ContentManager.Unload()
方法,以及Texture2D.Dispose()
方法。因此,请检查您自己的代码是否在任何时候调用这两个函数中的一个。
只有在“使用”Texture2D实例时才会抛出异常。因为SpriteBatch将纹理绘制一起批处理,所以在你结束SpriteBatch之前实际上不会使用纹理(此时它会一次性绘制所有内容)。如果您更改为SpriteSortMode.Immediate
SpriteBatch将停止批处理精灵,而是“立即”将它们绘制出来,你会问它。这将导致使用纹理,并在Draw
调用而不是End
调用时抛出异常,这样可以更容易地识别在使用时正在处理哪个纹理。
您发布的代码似乎没问题,我怀疑代码中的其他地方存在问题。以上信息可以帮助您确定问题所在。