2011-08-15 97 views
0

我已经在WP7中构建了一个简单的游戏,并且我试图使用MediaPlayer为其添加背景音乐。问题是,它只是用炸弹Windows Phone 7:Silverlight和播放音乐

{ “发生意外错误。”} {System.Exception的} System.InvalidOperationException

代码

try 
       { 
        MediaPlayer.Stop(); 
        // Timer to run the XNA internals (MediaPlayer is from XNA) 
        DispatcherTimer dt = new DispatcherTimer(); 
        dt.Interval = TimeSpan.FromMilliseconds(33); 
        dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } }; 
        dt.Start(); 

        Uri pathToFile = new Uri("Audio/music.m4a", UriKind.Relative); 
        Song playingSong = Song.FromUri("Music", pathToFile); 
        MediaPlayer.Play(playingSong); 
       } 
       catch (Exception e) 
       { 
        musicFailed = true; 
        Console.WriteLine("Exception: {0}", e.ToString()); 
        MessageBox.Show("Warning, music failed to play however you can still continue to play your game."); 
       } 
      } 

我尝试了一些调整,转换文件MP3,不同的路径等该文件被标记为永远复制和内容类型我也尝试删除调度程序,因为不知道是什么。

+0

对于它的价值,我认为Silverlight需要.wma文件。编辑:至少在Silverlight 4中,我不能说与XNA的SL 5。 –

+0

调试器连接时发生这种情况吗?试试这个http://msdn.microsoft.com/en-us/library/gg180729%28v=vs.92%29.aspx –

+0

是的,当调试器连接 – Burf2000

回答

1

如果您可以将您的音频文件转换成WAV格式,你可以尝试使用XNA SoundEffect中和SoundEffectInstance类:

SoundEffect se = SoundEffect.FromStream(isolatedStorageFileStream); 
SoundEffectInstance sei = se.CreateInstance(); 
sei.Play(); 

对于这个工作,你就需要引用XNA库(Microsoft.XNA .Framework)和初始化在这样的框架:

的App.xaml:

<Application> 
    <Application.ApplicationLifetimeObjects> 
     <local:XNAFrameworkDispatcherService /> 
     ... 
    </Application.ApplicationLifetimeObjects>  
</Application> 

,创造这个类的地方在应用程序命名空间(在前面的XAML引用这个命名空间的“本地”):

public class XNAFrameworkDispatcherService : IApplicationService 
{ 
    private DispatcherTimer frameworkDispatcherTimer; 
    public XNAFrameworkDispatcherService() 
    { 
     this.frameworkDispatcherTimer = new DispatcherTimer(); 
     this.frameworkDispatcherTimer.Interval = TimeSpan.FromTicks(333333); 
     this.frameworkDispatcherTimer.Tick += frameworkDispatcherTimer_Tick; 
     FrameworkDispatcher.Update(); 
    } 
    void frameworkDispatcherTimer_Tick(object sender, EventArgs e) { FrameworkDispatcher.Update(); } 
    void IApplicationService.StartService(ApplicationServiceContext context) { this.frameworkDispatcherTimer.Start(); } 
    void IApplicationService.StopService() { this.frameworkDispatcherTimer.Stop(); } 
} 
+0

不会干扰其他声音文件? – Burf2000

+0

以这种方式播放的所有声音都是相互独立的。这意味着你可以同时播放一个,两个或十个声音。 – alf

0

你的问题是,你的计时器也许不是打响了第一跳和FrameworkDispatcher.Update()不跑了。然后Play将抛出System.InvalidOperationException

更好地在应用程序中调度XNA Events。

完整指南:XNAAsyncDispatcher

+0

我给你的链接指南去 – Burf2000