【问题标题】:XNA: NullReferenceException when playing SoundEffect from another classXNA:从另一个类播放 SoundEffect 时出现 NullReferenceException
【发布时间】:2011-09-26 16:02:33
【问题描述】:

我既是 C# 又是 XNA 菜鸟,我有点卡住了。

在我的 Game1 类中,我添加了一个 SoundEffect 对象。在这个类中,我可以使用 [objectname].Play(); 播放声音。例如

public SoundEffect newSound;
newSound.Play();

但是,我有另一个代表精灵的类。如果我尝试从该类中发出声音,则会收到空引用异常错误。例如(在我的精灵类中):

Game1 newGame = new Game1();
newGame.newSound.Play();

我知道这是一个常见错误。我知道它与初始化对象实例有关。我的问题是,虽然我对此进行了广泛研究,并找到了解决此错误的其他方法,但我不明白为什么会收到它。

这就是我没有粘贴完整代码的原因。我想知道的是,谁能指出我可以向我解释这应该如何工作的教程或文章的方向?我宁愿不完全理解问题所在就让这个错误消失。

任何帮助将不胜感激。谢谢

【问题讨论】:

  • Game1 构造函数中你是在创建newSound 的实例吗?
  • DSW - 在 LoadContent 方法中,我有 newSound = Content.Load("soundfilename");

标签: c# xna nullreferenceexception soundeffect


【解决方案1】:

问题是,您的精灵需要访问运行游戏循环的 Game1 的实例,并且它已经初​​始化了 SoundEffectnew Game1() 为您提供了一个不同的 实例,它的状态不适合做任何事情。

这里通常要做的是在你的 Sprite 类上有一个构造函数参数或一个可设置的属性。我假设你的 Game1 类在某个时候创建​​了你的精灵:

Sprite s = new Sprite();

相反,您希望能够将 Game1 的实例传递给它:

Sprite s = new Sprite(this);

您需要修改您的 sprite 类,以便它 a) 在其构造函数中接受这个新参数,并且 b) 将此值存储到一个字段中,以便您以后可以访问它。

如果我能看到你的整个Sprite 课程,我可以更充实一点,但我很感激在这里发帖可能有点大。

【讨论】:

  • 谢谢 Damien,这看起来像我需要的。实际上我创建了一个测试项目只是为了尝试解决这个问题,所以我有一个相当轻量级的精灵类,我应该可以在这里发布。不过,我会先看看我能不能用这些信息弄清楚。
  • 谢谢 Damien,我按照你的建议做了,而且效果很好。也感谢您提供解释,而不仅仅是我所要求的解决方案。
【解决方案2】:

这就像假设很多事情一样......

您有 Game1 类,它是在 Update/Draw 无限循环中运行以保持游戏的主类...

然后你有另一个类,我们称它为 Enemy,在 Game1 的 Update 方法中你调用 Enemy.PlaySound()

在 Enemy::PlaySound 中,您想播放在 Game1 的 LoadContent 中初始化的声音,例如

public void PlaySound()
{
 Game1 newGame; //like assuming that with this you are pointing to the instance of Game1 that it's running and since it's not the instance of that class and it's not even initialized there is the NullReferenceException.....(I think)
newGame.NewSound.Play(); //Assuming againt that we have a property to access the NewSound
}

这里有很多长镜头......但问题有点不清楚......

编辑 - 首次评论后

这也行不通

它会像这样工作

public class Enemy
{
 ....

    public void PlaySound(Game1 newGame)
    {
        newGame.NewSound.Play();
    }
 ....
}

但是将 Game1 作为参数传递给 Enemy Methods 并不是一个好习惯...IMO

有很多好书、教程和框架可以指导你......

【讨论】:

  • 谢谢 - 你的假设都是正确的。我唯一不同的是 Game1 newGame 不在 PlaySound 方法中。我现在将测试它并让您知道...
  • 再次感谢,我已经尝试过了,但我仍然遇到同样的错误。如果我只发布所有代码可能会更容易,但我试图避免这种情况,因为我希望有人能够告诉我我应该如何正确地做到这一点,而不是仅仅修复我的代码中的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 2012-12-02
相关资源
最近更新 更多