c# - 如何在 C# 控制台应用程序中使用音效?
问题描述
我在 C# 控制台应用程序中做这个小型 RPG 游戏,我想在选择菜单选项时添加一些背景音乐和效果。
我注意到当背景音乐开始播放时我什么也做不了。我想到了线程,但这对我来说是全新的(6 周前开始学习 C#)。
我设法做的是开始一个新线程并播放声音
static Thread backgroundMusic = new Thread(() =>
{
using (var audioFile = new AudioFileReader(AppDomain.CurrentDomain.BaseDirectory + "\\menu.mp3"))
using (var outputDevice = new WaveOutEvent())
{
backgroundMusic.IsBackground = true;
outputDevice.Init(audioFile);
outputDevice.Play();
while (true)
{
Thread.Sleep(1);
}
}
});
然后我做的声音效果...
static Thread click = new Thread(() =>
{
using (var audioFile = new AudioFileReader(AppDomain.CurrentDomain.BaseDirectory + "\\click.mp3"))
using (var outputDevice = new WaveOutEvent())
{
click.IsBackground = true;
outputDevice.Init(audioFile);
outputDevice.Play();
while (true)
{
Thread.Sleep(1);
}
}
});
我从 click.Start(); 开始。背景音乐.Start();
好的,到目前为止一切都很好。它播放背景音乐和播放音效,但只有一次。Can I reuse the thread in some way to play the click sound again when another option is chosen? 我可以以某种方式中止声音吗?当你玩游戏和菜单时,我可能想要不同的音乐。
试过 backgroundMusic.Abort(); 但后来我得到了这个:
System.PlatformNotSupportedException: 'Thread abort is not supported on this platform.'
一旦我启动了一次线程,我就无法重新启动它。我试过 backgroundMusic.Start();
我一直在查看论坛,但似乎都涵盖了 Windows 窗体,并且没有使用控制台应用程序。
https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread?view=net-5.0 我也检查了文档......但老实说,我认为微软的文档不是给菜鸟的。我觉得很难理解。
我可能一直做错了,所以不要对我太苛刻,但请提出如何改进的建议。
所以我想要: 播放和循环播放背景音乐 每次选择菜单选项时单击声音
我有:背景音乐播放一次(直到文件末尾)单击第一个菜单选项上的声音,然后引发异常(见上文)
解决方案
你永远不应该使用Thread.Abort()
. 它只是以一种“邪恶”的方式停止线程——通过抛出异常,你永远不知道会有什么副作用。
你需要CancellationToken
. 查看这篇文章:https ://docs.microsoft.com/en-us/dotnet/standard/threading/cancellation-in-managed-threads
推荐阅读
- r - 如何使用 `exams2nops` 在 `exams` 生成的 pdf 中添加一行?
- swift - 协议的二级实现被忽略,有利于默认实现
- node.js - Discord.js 机器人:组织命令
- bash - libcurl c 代码中的 CURLOPT_COOKIEFILE 选项
- java - 使用 Java 的 Apache Sedona (Geospark) SQL:SQL 语句期间出现 ClassNotFoundException
- android - 是否可以在不需要用户更新到新版本的情况下对已发布的应用程序进行小的更改
- winapi - “自定义”键盘布局的安全 KLID?
- python-3.x - 如果列表中存在正确的值,则更改列中的值(熊猫)
- elasticsearch - 在更新查询弹性搜索无痛中获取日期值
- reporting-services - DistinctCount 正在计算 ssrs 中的空间