nullReferenceException, когда я пытаюсь воспроизвести звуковой эффект? - PullRequest
0 голосов
/ 04 февраля 2012

Я делаю деку со звуковыми эффектами и получаю:

"A first chance exception of type 'System.NullReferenceException'" 
   when building after 'UI Task' (Managed): 
   Loaded 'Microsoft.Xna.Framework.dll'

У меня все получилось, но после изменений (перезаписал предыдущую версию) я получаю эту ошибку, и язастрял.Я мой первый язык, а с C # я новичок.Я провел бесчисленные часы в поисках решения.

Я думаю, nullReferenceException исходит от loadound ()!У меня есть звуковые файлы (.wav) в папке с именем resources и build action: resources и copy to output: не копировать (перепробовал все варианты здесь).Также в ссылках была сделана ссылка на Microsoft.Xna.Framework

  using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Resources;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Media;

namespace Craggy_Island
{
    public partial class MainPage : PhoneApplicationPage
    {
        // The Resources to play
        private SoundEffect drink;//(plus 23 more effects)

        // Flag that indicates if we need to resume Zune playback upon exiting.
        bool resumeMediaPlayerAfterDone = false;

        // Constructor
        public MainPage()
        {
            InitializeComponent();

            // Timer to simulate the XNA game loop (SoundEffect class is from the XNA Framework)
            GameTimer gameTimer = new GameTimer();
            gameTimer.UpdateInterval = TimeSpan.FromMilliseconds(33);

            // Call FrameworkDispatcher.Update to update the XNA Framework internals.
            gameTimer.Update += delegate { try { FrameworkDispatcher.Update(); } catch { } };

            // Start the GameTimer running.
            gameTimer.Start();

            // Prime the pump or we'll get an exception.
            FrameworkDispatcher.Update();

            //LoadSound("Resources/drink.wav", out drink);
            // Create and load SoundEffect objects.
            LoadSound("Resources/drink.wav", out drink);

        }

        private void LoadSound(String SoundFilePath, out SoundEffect Sound)
        {
            // For error checking, assume we'll fail to load the file.
            Sound = null;

            try
            {
                // Holds informations about a file stream.
                StreamResourceInfo SoundFileInfo = App.GetResourceStream(new Uri(SoundFilePath, UriKind.Relative));

                // Create the SoundEffect from the Stream
                Sound = SoundEffect.FromStream(SoundFileInfo.Stream);
            }
            catch (NullReferenceException)
            {
                // Display an error message
                MessageBox.Show("Couldn't load sound " + SoundFilePath);
            }
        }



        private void button_Click(object sender, RoutedEventArgs e)
        {
            Button Current = sender as Button;

            try
            {
                if (Current.Equals(button1))
                    drink.Play();//(other buttons here for other sound effects)



            }
            catch (NullReferenceException)
            {
                MessageBox.Show("Can't play, sound file problem.");
            }

        }
        #region Zune Pause/Resume

        private void ZunePause()
        {
            // Please see the MainPage() constructor above where the GameTimer object is created.
            // This enables the use of the XNA framework MediaPlayer class by pumping the XNA FrameworkDispatcher.

            // Pause the Zune player if it is already playing music.
            if (!MediaPlayer.GameHasControl)
            {
                MediaPlayer.Pause();
                resumeMediaPlayerAfterDone = true;
            }
        }

        private void ZuneResume()
        {
            // If Zune was playing music, resume playback
            if (resumeMediaPlayerAfterDone)
            {
                MediaPlayer.Resume();
            }
        }

        #endregion Zune Pause/Resume

    }
}

Ответы [ 4 ]

0 голосов
/ 22 февраля 2017

У меня была почти такая же проблема.Наконец, я получил это случайно следующим образом:

StreamResourceInfo streaminfo = Application.GetResourceStream(new Uri("project_name;component/folder_name/Sound3.wav", UriKind.RelativeOrAbsolute));
SoundEffect effect1 = SoundEffect.FromStream(streaminfo.Stream);
effect1.Play();

И: свойство "Действие сборки" файла .wav должно быть установлено на "Ресурс", а свойство "Копировать в выходной каталог" Porperty должно быть установлено на«Копируй, если новее»

Кстати, я работаю с Silverlight5.

0 голосов
/ 04 февраля 2012

Откажитесь от моего первоначального ответа, если вы не используете XNA для разработки игр на Windows / Xbox. (Оригинальный плакат использует его для Zune.)

Относительно файла WAV:

Первая проблема заключается в том, что вам нужно установить Copy to Output Directory на Copy if newer. (Вы можете использовать Always, но в этом нет необходимости.)

Вторая проблема заключается в том, что его тип должен быть установлен на Content.

0 голосов
/ 04 февраля 2012

Вы запускаете игру до загрузки звука:

gameTimer.Start();

FrameworkDispatcher.Update();

LoadSound("Resources/drink.wav", out drink);
0 голосов
/ 04 февраля 2012

Вы используете жесткий подход. Посмотрите на ContentManager (доступно как this.Content из экземпляра Game). Вы можете использовать Content.Load<T>(string) для доступа к своему аудиофайлу, но вам нужно будет поместить аудиофайл в проект контента. Не меняйте его тип: оставьте его по умолчанию. Даже это не ресурс, пусть будет так. Он будет скомпилирован в другой формат. Кроме того, не указывайте расширение файла для параметра, переданного в Content.Load<>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...