2012-01-07 46 views
1

我的影片從網上例子得出一個基本的聲音管理器類:http://www.xnawiki.com/index.php?title=Basic_Sound_Manager_For_XNA_GS_3.0NullReferenceException異常的聲音管理器類,簡單的C#XNA

的問題是,每當我打電話LoadSound讀取(字符串ASSETNAME,串assetPath)方法,我得到一個NullReferenceException。我猜這意味着內容管理器找不到指定的引用並返回null。 雖然這對我來說沒有任何意義,因爲我參考的內容文件夾中確實有聲音。在我將健全的管理轉移到一個單獨的課程之前,它很有效

下面是我的SoundManager類中的類相關的代碼片段:

public static class SoundManager 
{ 
    // Class variables 
    static Dictionary<string, SoundEffect> sounds = new Dictionary<string, 
                  SoundEffect>(); 
    static Song currentSong; 
    static ContentManager content; 
    static float soundVolume = 1f; 

    // Initialize: Load the game's content manager. 
    public static void Initialize(Game game) 
    { 
     content = game.Content; 
    } 

    public static void LoadSound(string assetName) 
    { 
     LoadSound(assetName, assetName); 
    } 

    // Load a sound from a passed name into the dictionary 
    public static void LoadSound(string assetName, string assetPath) 
    { 
     sounds.Add(assetName, content.Load<SoundEffect>(assetPath)); 
    } 
} 

的例外行

sounds.Add(assetName, content.Load<SoundEffect>(assetPath)); 

在的Game1的Initialize()方法時,我打電話:

SoundManager.Initialize(this); 

在Game1的LoadContent()方法中,我打電話給:

SoundManager.LoadSound("collision", "Sounds\\collision"); 

Content.RootDirectory是「Content」,並且在content/sounds/ding.wav(資產名稱衝突)處存在聲音。我在這裏認真看不到任何問題。如果有任何人可以看到的任何奇怪的範圍問題,請幫助,我即將到期。

+0

您能否發佈完整的異常,包括堆棧跟蹤請 – 2012-01-07 19:22:35

+0

如果LoadSound在Initialize之前被調用,則內容將爲空。否則,問題可能在另一種方法中,在這種情況下,堆棧跟蹤將很有用。 – 2012-01-07 19:26:34

回答

3

如果NRE在您的代碼中,則必須是content爲空:即InitializeLoadSound之前未被調用。使用斷點或一些快速調試來檢查是這種情況。

+0

或''Initialize'被調用時'game.Content'爲null。 – 2012-01-07 19:26:51

+0

是的,LoadSound在Initialize之前被調用,謝謝。 – 2012-01-07 19:33:16

+0

高興地幫助:) – 2012-01-07 19:34:22