Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单游戏音效碰撞_C#_Visual Studio_Audio_Monogame - Fatal编程技术网

C# 单游戏音效碰撞

C# 单游戏音效碰撞,c#,visual-studio,audio,monogame,C#,Visual Studio,Audio,Monogame,我正在尝试用C#和Monogame引擎重新编程一些旧的街机游戏。然而,我遇到了一个问题 由于我的代码往往有点混乱,所以当玩家成功完成游戏时,我通常不会努力重置所有内容。相反,我只是关闭当前游戏实例并打开一个新实例,如下所示:(在Program.cs中) 现在问题来了。在游戏1中,我宣布并播放各种音效。第一次运行一切正常,但在接下来的所有Game1实例中,我的程序总是抛出一个与SharpDX.XAudio2.dll相关的System.AccessViolationException,此时我正在调用

我正在尝试用C#和Monogame引擎重新编程一些旧的街机游戏。然而,我遇到了一个问题

由于我的代码往往有点混乱,所以当玩家成功完成游戏时,我通常不会努力重置所有内容。相反,我只是关闭当前游戏实例并打开一个新实例,如下所示:(在Program.cs中)

现在问题来了。在游戏1中,我宣布并播放各种音效。第一次运行一切正常,但在接下来的所有Game1实例中,我的程序总是抛出一个与SharpDX.XAudio2.dll相关的System.AccessViolationException,此时我正在调用SoundEffect的.Play()-方法

我尝试播放SoundEffect实例,而不是实际的SoundEffects。现在它不再崩溃,而是从第二级开始完全沉默

你知道这个错误的原因是什么吗?我的游戏重新启动循环是否导致了我不知道的问题

先谢谢你

(我使用的是64位Win 7、VS Express 2015和Monogame 3.6)

你知道这个错误的原因是什么吗?我的游戏重新启动循环是否导致了我不知道的问题

对。不要这样做。 您正在销毁整个游戏对象只是为了重置游戏。这是一种非常糟糕的样式,因为它会破坏整个实例以及与之相关的所有内容。如果在其中使用
静态
变量,它们将保留在内存中,这可能是您遇到的问题

如果您想重置游戏,只需为所有内容编写一个
reset
-方法,并调用这些方法即可。清理和良好的代码是你应该使用的东西,而不是可怕的黑客

您能否显示更多的代码,以便能够理解出哪里出了问题


PS:永远不要写类似于
while(continueGame==true)
的东西,始终选择
while(continueGame)
问题可能是由于SharpDX对媒体文件本身的反应。例如,在XNA 4.0下作为SoundEffect加载的MP3文件(与相关的SoundEffectInstance一起)可以在MonoGame UWP下使游戏崩溃。(发生在我身上的是一个文件,但崩溃开始时我已经在使用SoundEffectInstance了。)

因此,您是否尝试过对相关音频文件进行重新编码,例如通过类似的实用程序?虽然它本身可能无法解决内部问题(音频文件的某些元素破坏了SharpDX),但如果重新编码的文件一开始就没有问题元素,那么这应该是一个有效的解决方案

    if (startgame)
    {
        do
        {
            using (var game = new Game1(level, points, soundOn))
                game.Run();
        } while (continueGame == true);
    }