Исключено исключение объекта - PullRequest
1 голос
/ 06 января 2011

Я недавно интегрировал метод 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);
        }

Ответы [ 2 ]

1 голос
/ 06 января 2011

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

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

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

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

1 голос
/ 06 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...