XNA 4.0 - ¿Qué ocurre cuando se minimiza la ventana?
Pregunta
estoy aprendiendo C #, y decidió intentar hacer juegos XNA simples para las ventanas usando F # (puro entusiasmo), y tiene una ventana con algunas imágenes a aparecer.
Aquí está el código:
(*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()
Y AddSprite Método:
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)]
El objeto _list tiene un ContentManager , aquí está la constructor
type SpriteList(_content : ContentManager byref) =
let mutable content = _content
let mutable list = []
Pero no puedo minimizar la ventana, ya que cuando recupera su enfoque, me sale este error:
ObjectDisposedException
No se puede acceder a un objeto desechado.
.
Nombre del objeto: 'GraphicsDevice'
Lo que está pasando?
Solución
Lo que se está observando es un comportamiento normal, que es por cierto no es específico de F #. Ver http://msdn.microsoft.com/ en-us / library / microsoft.xna.framework.game.loadcontent.aspx
Este método es llamado por Inicializar. Además, se le llama todo momento las necesidades de contenido juego para volver a cargar, por ejemplo, cuando se produce el evento DeviceReset.
¿Está cargando todo su contenido en Game.LoadContent? Si lo hace, usted no debería estar recibiendo estos errores.
Otros consejos
Bien después de luchar durante algún tiempo lo tengo al trabajo. Pero no parece "correcto" (Pensar de esa manera, usando XNA y F # no me parece bien tampoco, pero es divertido.)
(*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()
ajusto el GraphicsDevice siempre que mis necesidades de juego a LoadContent, y en las DrawSprites () método puedo comprobar si la textura está dispuesto, si lo es, se carga de nuevo.
Pero esta cosa me molesta. No sabía que tenía que cargar todo el contenido nuevo cada vez que se minimiza la ventana.
(Y el código hace que parezca que Initialize () carga el contenido y LoadContent () inicializa, pero bueno)