2010-12-30 9 views
2

私はF#を学んでおり、F#(純粋な熱意)を使って簡単なXNAゲームをWindowsに作ろうと決心し、いくつかの画像が表示されたウィンドウを得ました。XNA 4.0 - ウィンドウが最小化されるとどうなりますか?

ここでは、コードです:

(*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方法:

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

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があり、ここでコンストラクタだが

しかし、それはその焦点を取り戻したとき、私はこのエラーを取得するので、私は、ウィンドウを最小化することはできません。

説明ObjectDisposedException

Cannot access a disposed object.
Object name: 'GraphicsDevice'.

を何が起こっていますか?

+0

XNAは、ウィンドウを最小化すると自動的にGraphicsDeviceを削除するようです。私はそれをリロードしたにもかかわらず、同じエラーが発生しましたが、オブジェクト名は「Texture2D」です。私はテクスチャをリロードしようとしましたが、それはどちらもうまくいきません。私はこの1つで失われています –

答えて

0

あなたが観察しているそれは何F#に固有のものではない方法でだ、正常な動作です。 http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.game.loadcontent.aspx

This method is called by Initialize. Also, it is called any time the game content needs to be reloaded, such as when the DeviceReset event occurs.

あなたがGame.LoadContentですべてのコンテンツをロードしていますか?そうした場合、これらのエラーが発生することはありません。

1

しばらくの間苦労した後、私はそれを働かせました。しかし、それは 「右」は思えない(そのように考えて、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() 

私は私のゲームがLoadContentに必要があるときのGraphicsDeviceを調整し、 DrawSprites()メソッドでは、テクスチャが破棄されているかどうかをチェックします。テクスチャがあれば、再度ロードします。

しかし、このことは私にはバグです。ウィンドウが最小化されるたびに、すべてのコンテンツを再度ロードする必要があるかどうかはわかりませんでした。

は(そしてコードは、それが初期化(ように見える)コンテンツをロードし、そしてLoadContent()は初期化しますが、まあいい)

+0

あなたはF#で涼宮ハルヒの試合をしていますか? DO WANT –

+0

私のエンジンを別の言語に移しているだけですが、誰が知っていますか?私はアニメが好きです。 –

関連する問題