XNA 4.0 - Что происходит, когда окно минимизируется?
Вопрос
Я изучаю F# и решил попробовать сделать простые игры XNA для Windows, используя 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()
И Добавить Метод:
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 есть Контент менеджер, вот конструктор:
type SpriteList(_content : ContentManager byref) =
let mutable content = _content
let mutable list = []
Но я не могу минимизировать окно, с тех пор, как оно восстанавливает свое внимание, я получаю эту ошибку:
ObjectDisposedException
Не может получить доступ к расположенному объекту.
Имя объекта: 'GraphicsDevice'.
Что случилось?
Решение
То, что вы наблюдаете, - это нормальное поведение, это, кстати, не специфично для F#. Видеть http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.game.loadcontent.aspx
Этот метод вызывается с помощью инициализации. Кроме того, это называется в любое время, когда игровой контент должен быть перезагружен, например, когда происходит событие Devicereset.
Вы загружаете весь свой контент в game.loadcontent? Если вы это сделаете, вы не должны получать эти ошибки.
Другие советы
Хорошо, после некоторого времени я заставил его работать. Но это не кажется «правильным» (так думает, использование 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 всякий раз, когда моя игра должна загружать контент, и в методе DrawSprites () я проверяю, если текстура утилизирована, если она есть, загрузите его снова.
Но эта штука меня беспокоит. Я не знал, что мне пришлось снова загружать весь контент каждый раз, когда окно минимизируется.
(И код делает его выглядельным как инициализированное () загружает содержание, а загрузкаконтент () инициализируется, но хорошо)