2010-12-30 3 views
2

Ich lerne F #, und entschied mich zu versuchen, einfache XNA-Spiele für Windows mit F # (reiner Enthusiasmus) zu machen, und bekam ein Fenster mit einigen Bildern, die auftauchten.XNA 4.0 - Was passiert, wenn das Fenster minimiert wird?

Hier ist der Code:

(*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() 

Und die AddSprite Methode:

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)] 

Das _list Objekt hat eine Content, hier ist der Konstruktor:

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

Aber ich kann das Fenster nicht minimieren, da, wenn es seinen Fokus wiedergewinnt, bekomme ich diesen Fehler:

ObjectDisposedException

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

Was geschieht?

+0

Es scheint mir, dass XNA das GraphicsDevice automatisch bei der Minimierung des Fensters disponiert. Auch wenn ich es neu geladen habe, habe ich den gleichen Fehler, aber mit Objektname: 'Texture2D'. Ich habe versucht, die Textur neu zu laden, was auch nicht funktioniert. Ich bin auf diesem einen verloren –

Antwort

0

Was Sie beobachten normales Verhalten ist, ist es durch die Art und Weise nicht spezifisch für F #. Siehe 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.

Sind Sie alle Ihre Inhalte in Game.LoadContent Laden? Wenn Sie dies tun, sollten Sie diese Fehler nicht erhalten.

1

Gut nach dem Kämpfen für einige Zeit habe ich es zur Arbeit gebracht. Aber es scheint nicht „richtig“ (, so zu denken, mit XNA und F # auch nicht richtig scheint, aber es macht Spaß.)

(*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() 

ich einstellen Graphics wenn mein Spiel zu Loadcontent muss, und in der DrawSprites() Methode überprüfe ich, ob die Textur entsorgt wird, wenn ja, lade sie erneut.

Aber dieses Ding nervt mich. Ich wusste nicht, dass ich jedes Mal, wenn das Fenster minimiert wird, alle Inhalte erneut laden muss.

(Und der Code macht es wie initialisieren aussehen() lädt Inhalt und Loadcontent() initialisiert, aber oh well)

+0

Sie machen ein Haruhi Suzumiya Spiel in F #? DO WANT –

+0

Ich übertrage meine Engine nur in eine andere Sprache ..., aber wer weiß? Ich liebe den Anime. –