2012-12-19 120 views
0

我的XNA遊戲有這個「流氓」System.InvalidOperationException只會發生有時似乎是隨機觸發或至少是我的控制輸入明智的觸發。在按下開始並加載第一個菜單屏幕後,(如果有幫助,我使用GameStateManagement樣本作爲遊戲基礎)遊戲有時候但並不總是在「foreach」的「in」部分拋出System.InvalidOperationException在屏幕GameScreen屏幕)」爲方法的完整代碼:Rogue異常,System.InvalidOperationException異常,XNA

  /// <summary> 
    /// Tells each screen to draw itself. 
    /// </summary> 
    public override void Draw(GameTime gameTime) 
    { 

     foreach (GameScreen screen in screens) //exception thrown at the "in" part 
     { 
      if (screen.ScreenState == ScreenState.Hidden) 
       continue; 

      screen.Draw(gameTime); 
     } 
    } 

我以什麼觸發此異常,因爲我沒有做任何事情不同,當它拋出異常老實無能,當它不。我不能完全肯定這是否會幫助你,但,這是異常的詳細信息

at System.Collections.Generic.List`1.Enumerator.MoveNext() 
    at GameStateManagement.ScreenManager.Draw(GameTime gameTime) 
    at Microsoft.Xna.Framework.Game.Draw(GameTime gameTime) 
    at GameStateManagement.GameStateManagementGame.Draw(GameTime gameTime) 
    at Microsoft.Xna.Framework.Game.DrawFrame() 
    at Microsoft.Xna.Framework.Game.Tick() 
    at Microsoft.Xna.Framework.Game.HostIdle(Object sender, EventArgs e) 
    at Microsoft.Xna.Framework.GameHost.OnIdle() 
    at Microsoft.Xna.Framework.XboxGameHost.RunOneFrame() 
    at Microsoft.Xna.Framework.XboxGameHost.Run() 
    at Microsoft.Xna.Framework.Game.RunGame(Boolean useBlockingRun) 
    at Microsoft.Xna.Framework.Game.Run() 
    at GameStateManagement.Program.Main() 
} System.Exception {System.InvalidOperationException} 

,這是調用堆棧:

> GameStateManagementSample.exe!GameStateManagement.ScreenManager.Draw(Microsoft.Xna.Framework.GameTime gameTime) Line 338 + 0x33 bytes C# 
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.Draw(Microsoft.Xna.Framework.GameTime gameTime) + 0x4d bytes 
GameStateManagementSample.exe!GameStateManagement.GameStateManagementGame.Draw(Microsoft.Xna.Framework.GameTime gameTime) Line 89 + 0x7 bytes C# 
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.DrawFrame() + 0x6a bytes 
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.Tick() + 0x2a9 bytes 
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.HostIdle(object sender, System.EventArgs e) + 0x6 bytes 
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.GameHost.OnIdle() + 0x19 bytes 
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.XboxGameHost.RunOneFrame() + 0xc bytes 
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.XboxGameHost.Run() + 0x1b bytes  
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.RunGame(bool useBlockingRun) + 0x9c bytes 
Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.Run() + 0x7 bytes 
GameStateManagementSample.exe!GameStateManagement.Program.Main() Line 108 + 0x6 bytes C# 

謝謝! Ivatrix。

回答

1

它看起來像你的遊戲代碼正在修改screens在你沒有考慮過的代碼路徑上。查看IEnumerator.MoveNext上的文檔。

集合在枚舉器創建後被修改。

+0

只是爲了澄清我在這裏找到什麼,這是否意味着「屏幕」在「屏幕」被初始化之前被修改了? – Ivatrix

+0

哎呀我的意思是之後,而不是之前。 – Ivatrix

+0

確定忽略我以前的評論我現在得到的是統計員,我對編程還很陌生:P我想我現在可能已經修復了它!雖然我無法確切知道,因爲這並非一貫的例外。我所做的是想想它是如何導致例外的,以便弄清楚爲什麼,並且我認爲它只發生在主菜單屏幕上,所以我必須在那裏改變某些東西。我查看了轉換主菜單屏幕和其他屏幕之間的區別,發現我只在主菜單中使用了空白播放器索引,而在其他 – Ivatrix