XNA: NullReferenceException时播放声音效果从另一个类

本文关键字:另一个 音效 声音 NullReferenceException 播放 XNA | 更新日期: 2023-09-27 18:09:43

我是一个c#和XNA新手,我有点卡住了。

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

然而,我有另一个类代表一个精灵。如果我尝试从该类中播放声音,就会得到nullreference异常错误。例如(在我的精灵类中):

Game1 newGame = new Game1();
newGame.newSound.Play();
我知道这是一个常见的错误。我知道它与初始化对象实例有关。我的问题是,虽然我已经广泛地研究了这个问题,并找到了解决这个错误的其他方法,但我不明白为什么我会收到它。

这就是为什么我没有粘贴完整的代码。我想知道的是,谁能给我指出一个教程或文章的方向,可以向我解释这应该如何工作?我不希望在没有完全了解问题所在的情况下让这个错误消失。

任何帮助将是最感激的。由于

XNA: NullReferenceException时播放声音效果从另一个类

问题是,你的精灵需要访问运行游戏循环的Game1的实例,这已经初始化了SoundEffectnew Game1()给你一个不同的实例,它不处于正确的状态,不能做任何事情。

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

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

Sprite s = new Sprite(this);

你需要修改你的精灵类,使它a)在它的构造函数中接受这个新参数,b)将这个值存储到一个字段中,以便你以后可以访问它。

如果我能看到你的整个Sprite类,我可以更充实一点,但我可以欣赏它可能有点大,张贴在这里。

这就像是假设了很多东西....

你有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
}

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

EDIT - After First Comment

那也不行

它将像这样工作

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

但是将Game1作为参数传递给敌人方法并不是一个好的做法…IMO

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

  • http://www.flatredball.com/
  • http://nuclexframework.codeplex.com/
  • http://create.msdn.com/en-US/education/gamedevelopment