XNA 4.0-ウィンドウが最小化されるとどうなりますか?
質問
私はF#を学んでおり、F#(純粋な熱意)を使用してWindows用のシンプルなXNAゲームを作成してみることにし、いくつかの画像が表示されたウィンドウを取得しました。
これがコードです:
(*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オブジェクトには コンテンツマネージャ, 、ここにあります コンストラクタ:
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()メソッドでは、テクスチャが処分されているかどうかを確認します。
しかし、これは私を悩ませます。ウィンドウが最小化されるたびに、すべてのコンテンツを再度ロードする必要があるとは知りませんでした。
(そして、コードはinitialize()loads contentのように見え、loadcontent()が初期化されますが、まあまあ)