好吧,我有一个非常奇怪的问题。我现在正在用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)
{
// ..
}
}
答案 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();
}
}