XNA 4.0 - 窗口最小化后会发生什么?

时间:2010-12-30 16:36:19

标签: f# xna xna-4.0 c#-to-f#

我正在学习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对象有一个 ContentManager ,这里是构造函数

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

但我无法最小化窗口,因为当它重新获得焦点时,我会收到此错误:

的ObjectDisposedException

  

无法访问已处置的对象   对象名称:'GraphicsDevice'。

发生了什么事?

2 个答案:

答案 0 :(得分: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()初始化,但哦,好吧)

答案 1 :(得分:0)

您所观察到的是正常行为,而这种行为并非特定于F#。见http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.game.loadcontent.aspx

  

Initialize调用此方法。此外,只要需要重新加载游戏内容,就会调用它,例如发生DeviceReset事件时。

您是否在Game.LoadContent中加载了所有内容?如果你这样做,你不应该得到这些错误。