2016-08-21 7 views
0

Хорошо, у меня очень странные проблемы. Я сейчас пишу простую игру в C#/MonoGame (в Linux). Я пытаюсь сыграть SoundEffect. Когда я звоню Play() (хотя он был правильно загружен в методе LoadContent()). Он бросает NullReferenceException с сообщением Object Reference not set to an instance of an object.SoundEffect.Play() выбрасывает исключение NullReferenceException даже при загрузке звука

Вот как код структурирован

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) 
    { 
     // .. 
    } 
} 
+0

Может быть, вы столкнулись с этим вопросом [] (http://community.monogame.net/t/null-reference-exception-when-calling-play-on-a-soundeffect-or -soundeffectinstance/7319/10) – craftworkgames

ответ

0

Сообщение об ошибке говорит все это. В то время, когда вы вызываете Update (GameTime gameTime), объект _sfx не инициализируется.

Невозможно узнать, как вы хотите создать свою игру, но вы можете проверить это, изменив код, как показано ниже, и больше не будет иметь нулевого ссылочного исключения. Возможно, это не так, как вы хотите, чтобы ваш код был разработан, но он дает вам представление о том, где это происходит, и как его исправить. См. Код ниже.

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

было бы лучше проверить для 'null', а если' _sfx == null', загрузите звук, но да. –

+0

@ Jean-FrançoisFabre абсолютно, null check добавлено –

+0

Способ, которым этот код структурирован, означает ли это, что мне нужна загрузка звукового эффекта каждый раз, когда я хочу его воспроизвести? – Benjamin

0

Мои слепые догадки (так как вы не имеете код включен):

  • GraphicsDeviceManager не создается внутри конструктора (должен быть создан до base.Initialize() называется)
  • Или вы забыли позвонить по телефону base.Initialize() в свой метод Initialize.
+0

Нет, это не тот случай. Я дважды проверил его. – Benjamin

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

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