2

私はF#を学んでいて、F#(純粋な熱意)を使用してウィンドウ用の単純な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オブジェクトにはContentManagerがあります。コンストラクターは次のとおりです。

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

しかし、ウィンドウを最小化することはできません。ウィンドウがフォーカスを取り戻すと、次のエラーが発生するためです。

ObjectDisposedException

破棄されたオブジェクトにアクセスできません。
オブジェクト名:'GraphicsDevice'。

何が起こっている?

4

2 に答える 2

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() メソッドで、テクスチャが破棄されているかどうかを確認し、破棄されている場合は再度読み込みます。

しかし、これは私を悩ませます。ウィンドウが最小化されるたびに、すべてのコンテンツを再度読み込む必要があるとは知りませんでした。

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

于 2010-12-30T18:49:39.430 に答える
0

あなたが観察しているのは通常の動作です。ちなみに、F# に固有のものではありません。http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.game.loadcontent.aspxを参照してください。

このメソッドは、Initialize によって呼び出されます。また、DeviceReset イベントが発生したときなど、ゲーム コンテンツをリロードする必要があるときはいつでも呼び出されます。

すべてのコンテンツを Game.LoadContent にロードしていますか? その場合、これらのエラーは発生しないはずです。

于 2011-01-03T20:00:35.027 に答える