XNA 4.0 - Что происходит, когда окно свернуто? - PullRequest
2 голосов
/ 30 декабря 2010

Я изучаю 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'.

Что происходит?

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

Ну, после некоторого времени я заставил его работать.Но это не кажется «правильным» (если подумать, использование 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 (), загружает содержимое, а LoadContent () инициализирует, ну да ладно)

0 голосов
/ 03 января 2011

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

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

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

...