XNA: NullReferenceException при воспроизведении SoundEffect из другого класса - PullRequest
0 голосов
/ 26 сентября 2011

Я и C #, и XNA noob, и я немного застрял.

В своем классе Game1 я добавил объект SoundEffect.Из этого класса я могу затем воспроизвести звук, используя [objectname] .Play () ;.Например,

public SoundEffect newSound;
newSound.Play();

Однако у меня есть другой класс, который представляет спрайт.Если я пытаюсь воспроизвести звук из этого класса, я получаю ошибку исключения nullreference.Например (в моем классе спрайтов):

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

Я знаю, что это распространенная ошибка.Я знаю, что это как-то связано с инициализацией экземпляра объекта.Моя проблема в том, что, хотя я тщательно исследовал это и нашел другие решения этой ошибки, я не понимаю, почему я ее получаю.

Вот почему я не вставил свой полный код.Меня интересует, может ли кто-нибудь указать мне направление на учебник или статью, которая может объяснить мне, как это должно работать?Я бы не хотел, чтобы эта ошибка исчезла без полного понимания проблемы.

Любая помощь будет наиболее ценной.Спасибо

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Проблема в том, что вашему спрайту нужен доступ к экземпляру Game1, который запускает игровой цикл и инициализирует SoundEffect.new Game1() дает вам другой экземпляр, который не в нужном состоянии, чтобы что-либо делать.

Что обычно делается здесь, это иметь аргумент конструктора или настраиваемое свойствов вашем классе Sprite.Я предполагаю, что ваш класс Game1 создаст ваш спрайт в какой-то момент:

Sprite s = new Sprite();

И вместо этого вы захотите передать ему экземпляр Game1:

Sprite s = new Sprite(this);

И вы 'Мне нужно будет изменить ваш класс спрайта так, чтобы он а) принял этот новый аргумент в своем конструкторе и б) сохранил это значение в поле, чтобы вы могли получить к нему доступ позже.

Я мог быуточните это немного подробнее, если бы я мог видеть весь ваш класс Sprite, но я могу оценить, что он может быть немного большим, чтобы публиковать здесь.

1 голос
/ 26 сентября 2011

Это будет похоже на принятие многих вещей ...

У вас есть класс Game1, это основной класс, который работает в бесконечном цикле обновления / рисования, чтобы сохранить игру ...

Затем у вас есть другой класс, который назовем его Enemy, и в методе Update игры Game1 вы делаете вызов наподобие Enemy.PlaySound ()

В Enemy :: PlaySound вы хотите воспроизвести звук, который вы инициализировали в LoadContent of Game1, что-то вроде

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

Есть много хороших книг, учебных пособий и рамок, которые могут вам помочь ...

...