XNA 4.0 — что происходит, когда окно свернуто?

Я изучаю F # и решил попробовать сделать простые игры XNA для окон с использованием F # (чистый энтузиазм) и получил окно с некоторыми изображениями.

Вот код:

(*Methods*)     
member self.DrawSprites() = 
    _spriteBatch.Begin()
    for i = 0 to _list.Length-1 do
        let spentity = _list.List.ElementAt(i)
        _spriteBatch.Draw(spentity.ImageTexture,new Rectangle(100,100,(int)spentity.Width,(int)spentity.Height),Color.White)      
    _spriteBatch.End()

(*Overriding*)   
override self.Initialize() =
    ChangeGraphicsProfile()                              
    _graphicsDevice <- _graphics.GraphicsDevice
    _list.AddSprite(0,"NagatoYuki",992.0,990.0)
    base.Initialize() 

override self.LoadContent() =         
    _spriteBatch <- new SpriteBatch(_graphicsDevice)
    base.LoadContent()

override self.Draw(gameTime : GameTime) =
    base.Draw(gameTime)
    _graphics.GraphicsDevice.Clear(Color.CornflowerBlue)
    self.DrawSprites()

И метод AddSprite:

   member self.AddSprite(ID : int,imageTexture : string , width : float, height : float) = 
      let texture = content.Load<Texture2D>(imageTexture)
      list <- list @ [new SpriteEntity(ID,list.Length, texture,Vector2.Zero,width,height)]

Объект _list имеет ContentManager, вот конструктор:

   type SpriteList(_content : ContentManager byref) =
      let mutable content = _content
      let mutable list = []

Но я не могу свернуть окно, так как, когда оно восстанавливает фокус, я получаю эту ошибку:

ObjectDisposedException

Не удается получить доступ к ликвидированному объекту.
Имя объекта: «GraphicsDevice».

Что случилось?


person Conrad Clark    schedule 30.12.2010    source источник
comment
Мне кажется, что XNA автоматически удаляет GraphicsDevice, когда я сворачиваю окно. Хотя, когда я перезагрузил его, я получил ту же ошибку, но с именем объекта: «Texture2D». Я попытался перезагрузить текстуру, что тоже не работает. Я потерялся на этом   -  person Conrad Clark    schedule 30.12.2010


Ответы (2)


То, что вы наблюдаете, является нормальным поведением, оно, кстати, не относится к F #. См. http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.game.loadcontent.aspx

Этот метод вызывается Initialize. Кроме того, он вызывается каждый раз, когда необходимо перезагрузить игровой контент, например, когда происходит событие DeviceReset.

Вы загружаете весь свой контент в Game.LoadContent? Если вы это сделаете, вы не должны получать эти ошибки.

person Joh    schedule 03.01.2011

Ну, после борьбы в течение некоторого времени я заставил его работать. Но это не кажется «правильным» (думая таким образом, использование XNA и F# тоже не кажется правильным, но это весело).

(*Methods*)     
member self.DrawSprites() = 
    _spriteBatch.Begin()
    for i = 0 to _list.Length-1 do
        let spentity = _list.List.ElementAt(i)
        if spentity.ImageTexture.IsDisposed then
            spentity.ImageTexture <- _list.Content.Load<Texture2D>(spentity.Name)
        _spriteBatch.Draw(spentity.ImageTexture,new Rectangle(100,100,(int)spentity.Width,(int)spentity.Height),Color.White)      
    _spriteBatch.End()

(*Overriding*)   
override self.Initialize() =
    ChangeGraphicsProfile()           
    _list.AddSprite(0,"NagatoYuki",992.0,990.0)
    base.Initialize() 

override self.LoadContent() =   
    ChangeGraphicsProfile()           
    _graphicsDevice <- _graphics.GraphicsDevice
    _spriteBatch <- new SpriteBatch(_graphicsDevice)
    base.LoadContent()

Я настраиваю GraphicsDevice всякий раз, когда моей игре требуется LoadContent, и в методе DrawSprites() я проверяю, удалена ли текстура, и если да, загружаю ее снова.

Но эта штука меня бесит. Я не знал, что мне нужно снова загружать весь контент каждый раз, когда окно сворачивается.

(И код выглядит так, будто Initialize() загружает Content, а LoadContent() инициализирует, ну да ладно)

person Conrad Clark    schedule 30.12.2010
comment
Вы делаете игру по Харухи Судзумии на F#? ХОТИТЕ - person Chris Charabaruk; 31.12.2010
comment
Я просто перевожу свой движок на другой язык... но кто знает? Я люблю аниме. - person Conrad Clark; 03.01.2011