即使加载了声音,SoundEffect.Play()也会抛出NullReferenceException

时间:2016-08-21 21:19:33

标签: c# xna monogame soundeffect

好吧,我有一个非常奇怪的问题。我现在正在用C#/ MonoGame(在Linux上)编写一个简单的游戏。我正在尝试SoundEffect。当我调用Play()时(即使它已在LoadContent()方法中正确加载)。它正在使用NullReferenceException消息Object Reference not set to an instance of an object

以下是代码的结构

public class MyGame : Game
{
    // ..
    private SoundEffect _sfx;

    public PingGame ()
    {
        // ...
    }

    protected override void Initialize ()
    {
        // ...
    }

    protected override void LoadContent ()
    {
        // ...

        // No errors here on loading it
        _sfx = Content.Load<SoundEffect>("noise.wav");
    }

    protected override void Update (GameTime gameTime)
    {
        // ...

        if (playSound)
        {
            // This is where the error is thrown
            _sfx.Play();
        }

        // ...
    }

    protected override void Draw (GameTime gameTime)
    {
        // ..
    }
}

3 个答案:

答案 0 :(得分:0)

错误信息就是这么说的。在您调用Update (GameTime gameTime)时,对象_sfx未初始化。

无法知道您希望如何设计游戏,但您可以通过更改下面的代码来测试,并且您将不再拥有null引用异常。这可能不是您希望如何设计代码,但它可以让您了解错误的位置以及如何解决问题。请参阅下面的代码。

protected override void Update (GameTime gameTime)
{
    // ...

    if (playSound)
    {
        // This is where the error is thrown
        // THIS ENSURES WHEN THIS METHOD IS INVOKED _sfx is initialized.

        _sfx = Content.Load<SoundEffect>("noise.wav");
        if(_sfx != null){
          _sfx.Play();
        }
    }
    // ...
}

答案 1 :(得分:0)

我的盲目猜测是(因为你没有包含代码):

  • GraphicsDeviceManager不是在构造函数内创建的(需要在调用base.Initialize()之前创建)
  • 或者您忘记在base.Initialize()方法中调用Initialize方法。

答案 2 :(得分:0)

protected override void Update(GameTime gameTime)
{
    // ...

    if (playSound)
    {
        if (_sfx == null)
        {
            Content.Load<SoundEffect>("noise.wav");
        }
        _sfx.Play();
    }
}