質問

私は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()が初期化されますが、まあまあ)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top