我既是C#又是XNA noob,我有点卡住了。
在我的Game1课程中,我添加了一个SoundEffect对象。从这个类中,我可以使用[objectname] .Play();来播放声音。 E.g。
public SoundEffect newSound;
newSound.Play();
但是,我有另一个代表精灵的类。如果我尝试从该类中发出声音,我会得到一个nullreference异常错误。例如(在我的精灵类中):
Game1 newGame = new Game1();
newGame.newSound.Play();
我知道这是一个常见的错误。我知道这与初始化对象实例有关。我的问题是,虽然我已经对此进行了广泛的研究,并找到了解决此错误的其他方法,但我不明白为什么我会收到它。
这就是为什么我没有粘贴我的完整代码。我想知道的是,有人能指出我的教程或文章的方向,可以向我解释这应该如何工作?我不想在没有完全理解问题的情况下让这个错误消失。
任何帮助都将非常感激。感谢
答案 0 :(得分:1)
这就像假设很多东西......
你有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作为参数传递给敌人方法并不是一个好习惯...... IMO
有很多好书,教程和框架可以指导你......
答案 1 :(得分:1)
问题是,你的精灵需要访问正在运行游戏循环的Game1的实例,并初始化了SoundEffect
。 new Game1()
正在为您提供一个不同的实例,该实例无法正常执行任何操作。
这里通常要做的是在Sprite类上有一个构造函数参数或一个可设置的属性。我假设你的Game1类在某些时候创建了你的精灵:
Sprite s = new Sprite();
相反,您希望能够将Game1的实例传递给它:
Sprite s = new Sprite(this);
你需要修改你的精灵类,以便它a)在它的构造函数中获取这个新参数,并且b)将这个值存储到一个字段中,以便你以后可以访问它。
如果我能看到你的整个Sprite
课程,我能够更多地充实这一点,但我可以理解,在这里发帖可能有点大。