• 通过XACT添加声音——使用XACT


    使用XACT

    XACT曾经是一个只提供给Xbox 360开发者的工具,你不能轻易地得到它。您必须是一个经验证的Xbox 360开发者,并获得XDK(Xbox开发工具包)。即使你是一个专业的游戏开发者并从业多年,这也不是一件容易的事情。

    但是,现在已经发生了变化。一年前微软决定在DirectX SDK包含XACT,虽然在PC游戏上用得不多,但这对XNA游戏开发是很重要的,因为这是在Xbox 360上使用XNA播放声音的唯一办法。您不必安装DirectX SDK就能使用XACT工具,它已经包含在XNA GSE安装文件中了。您可以在开始-所有程序-Microsoft XNA Game Studio Express-Tools-XACT Auditioning Utility中找到它。如果您使用另一个版本的XACT请确保它支持XNA,例如,2006年8月的DirectX SDK已包含了XACT 2.0,但它将内容文件保存为4.0版本。而2006年10月的DirectX SDK和XNA框架使用4.1版本,与之前的版本不兼容。如果您加载旧的XACT项目可能会出现非常奇怪的错误,如文件丢失或提示InvalidOperationException错误。未来的版本也可能有所不同,为了确保您的XACT项目能被支持,请检查.xap文件的版本(.xap只是一个简单的文本文件,你可以用任何文本编辑器打开它)。

    .xap文件的结构很简单,看起来类似xml文件。但版本号有点混乱,你要确保是13版(即XACT工具的4.1版,这可在关于对话框中看到,见图9-4)。像11或12的老版本(在老的DirectX软件开发工具包中)不被支持。这个问题会发生在打开一个早期XNA测试版本(2006年8月至10月之间)时,测试版本仍然使用旧的XACT工具。

    1
    图 9-4

    Signature = XACT2;
    Version = 13;
    Options
    {
    }
    Global Settings
    {
    [...]

    如果您只想在Visual Studio的XACT项目内改变一个简单的值,如音量大小,只需在Visual Studio的文本编辑器打开.xap文件,找到储存音量的位置并改变它就可以了。

    对于游戏开发者来说最好有专人负责音效和音乐。让他学会使用XACT工具,你就不用关心声音,音量和格式的问题了。但不幸的是,大多数小团队没有专人负责声音,如果你要全部自己实现,那么除了要制作图形及其他游戏内容文件,您也将制作自己的声音效果。一开始可以利用现成的音效或免费提供的声音。可选用类似的音乐,可以从你的MP3库中找,最终版本您需要自己的音乐,当然,你不能只用别人的音乐。一些音乐文件都是免费使用的,但大多数音乐都不是免费的。获取音效文件比较容易,对于一些简单的音效你也可以本书中的音效文件。如果你没有音效文件或没人可以帮你,我建议你在互联网上寻找免费音效的网站。

    为了让事情变得更有趣,你将要为这本书第三部分最后的一个游戏——Xna Shooter创建sound项目,Xna Shooter是一个简单的射击游戏,有很酷的三维图形、声音效果并支持键盘,鼠标和Xbox 360手柄(将在下一章详细讨论)。

    创建项目

    当您打开XACT工具,您将看到一个新的空项目(见图9-5)。它不包含任何声音文件,wave或sound bank,但创建新项目时某些变量和设置已经创建了:

    • 项目树目录,它总是包含相同的根节点。你不能改变它。

    • 两种默认类别:Default和Music,它可以将声音文件标记为音效或音乐,这两种文件行为是不同的。

    • 一个全局变量,SpeedOfSound,长度始终是343.5和4个cue实例变量,多普勒频移,Cue实例数量,定位角。所有这些变量只对3D声音来说才是重要的,但在XNA中3D音效不被支持。当你编写代码来播放音效时会详细讨论这个议题。

    • 一个全局effect路径,现在没有任何东西。

    • 其他根节点是空的。你必须自己创建子节点,可以单击工具栏或右键点击节点并选择New。例如,“New Wave Bank”创建一个新的wave bank。

    2
    图 9-5

    要将wav文件导入到新的XACT项目中你必须首先建立一个wave bank,它储存了所有wav文件,然后加载并被你的游戏使用。不仅仅是加载wav文件,还要做大量的其他工作,XACT能使音效艺术家在设置各种参数时有更多的灵活性。当你必须自己实现XACT项目时帮助不大,但至少XACT能让您的项目可以更好地组织声音文件,你能知道在哪可以改变声音的参数,而不需要进入游戏代码。使用XACT的缺点是,你不能动态加载声音文件,所有内容的文件(如编译模式)必须在启动游戏时被创建和加载,当游戏运行时就不能再添加东西了。一开始这让我很恼火,因为我喜欢在编写和调试游戏时添加动态的东西,但一旦习惯了,这也很不错。现在,我在项目早些时候就创建所有声音文件,并只使用单元测试中已有的声音。以后sound项目会被不断地修改。

    创建wave bank

    要创建一个wave bank,您可以右击wave bank,并选择“New Wave Bank”,或者您也可以使用工具栏创建一个wave bank(第八个选项,橙白相间的图标,见图9-5)。Wave bank仅储存使用到的所有声音文件。你可以有不同的wave bank,举例来说,如果游戏中有多个关卡,你只需要载入当前关卡的wave bank,通过这种方式可以分离波形文件并优化您的游戏。这本书的所有项目和我曾经制作过的其他项目只包含一个wave bank,相对于分割音乐和音效以支持流媒体,我认为拥有多个wave bank不是很重要,你可能永远都用不到。

    在创建好自己的wave bank后,您就可以拖放wav文件到wave bank或者使用右键菜单选择“Insert Wave Files”。图9-6显示了Xna Shooter游戏将要使用到的所有声音文件。

    3
    图 9-6

    如您所见,所有的声音文件仍然未被使用,用红色的斜体显示。一旦您将这些波形文件添加到sound,它们会变成绿色。但在此之前,你应该确保所有的文件都有正确的设置。默认情况下没有选择压缩,除了音乐文件大多数声音文件都相当小,所有的音效文件都小于1 MB。音乐文件占用了高达36 MB的磁盘空间,长3.5分钟,并以前面讨论过的格式(16位44KHz的立体声的PCM)储存。

    如果你想压缩的音乐文件,请在wave属性面板中单击它并选择您想要的压缩预置。目前显示为<none>,但如果你点击下拉列表,其中并没有其他选项。你必须首先创建一个压缩预置然后才可以使用它。XACT工作原理与其他预置类似。例如,如果你想为音效创建一个自定义变量,你必须首先在变量部分创建它,然后才可以在sound bank中选择并使用它。

    音乐数据压缩

    要创建一个新的压缩预置可以单击左边树目录中的Compression Presets并选择“New Compression Preset”(见图9-7)。现在输入一个名称,你只是想创建一个音乐文件压缩架构。Notes部分不会在XACT工具的外部使用,只是给你一个简单的注释。其他面板没有Notes部分和不需要的可选参数。您可能会在第一次使用XACT时感到困惑。一开始我不喜欢它,但过了一段时间后就会习惯,你必须记住,这是在Xbox 360和XNA播放声音的唯一办法。如果您创建一个只能在Windows运行的游戏,您仍然可以使用DirectSound或其它声音引擎,也许这样使用起来更简单或有其他优点。最后,用每块128个样本(默认值)设置Windows压缩(只能用于ADPCM)。更高的值会使文件更小,但质量会下降。每块32个样本是最高的ADPCM质量,但文件会增大约30%。

    4
    图 9-7

    Xbox 360上您只能选择XMA,但压缩率好很多。你可能会问,当你只能选择一钟压缩时却有这么多的选项。好吧,希望将来能获得更多的压缩格式。XMA对Xbox 360来说很好,但有时它产生的文件有点大,但它听起来音质很好。但在Windows平台上ADPCM无法使用。它音质不如MP3文件,而且大小是MP3的4-5倍。若支持WMA或MP3一定会很棒。

    不幸的是,XACT不会即时显示所产生的XMA文件的大小。你必须首先编译该项目,才会告诉您XMA格式的波形文件被压缩了多少。要编译该项目,您可以点击工具栏的最后一个按钮或按下F7。默认情况下,该项目将编译为Windows平台,您仍然没法看到XMA压缩的结果。你必须在View菜单中切换到Xbox 360 output然后编译XACT项目,这样wave bank将显示Xbox 360上的文件大小(PC压缩率始终会显示,它们总是同一比率,27%是默认的ADPCM的设置)。

    下表显示了XnaShooterGameMusic.wav文件的压缩比(未压缩时有36 MB)。

    Open table as spreadsheet

    压缩

    文件大小

    压缩率

    Uncompressed

    36 MB

    100%

    MP3 with 192kbit

    4.8 MB

    13%

    MP3 with 128kbit

    3.1 MB

    8.5%

    AccPlus with 48kbit, similar to MP3 192kbit

    1.2 MB

    3%

    AccPlus with 24kbit, similar to MP3 96kbit

    0.6 MB

    1.6%

    OGG with 160kbit

    3.8 MB

    11%

    XACT ADPCM 32 samples per block

    12.5 MB

    34%

    XACT ADPCM 128 samples per block (default)

    9.9 MB

    27%

    XACT ADPCM 512 samples per block

    9.3 MB

    26%

    XACT XMA 100% Quality

    14.3 MB

    40%

    XACT XMA 90% Quality

    8.9 MB

    25%

    XACT XMA 75% Quality

    5.5 MB

    15%

    XACT XMA 60% Quality (default)

    4.7 MB

    13%

    XACT XMA 30% Quality

    3.5 MB

    10%

    XACT XMA 10% Quality

    2.9 MB

    8%

    低质量的XMA文件在大小上与MP3相当,但是质量更糟。我不会推荐使用非常低压缩设置的XMA文件。使用50%或更高,文件的大小仍然接近于60%(默认设置)和75%(我最喜爱的设置),因为对于高质量设置来说,文件仍保持非常小(低于15%,类似于192kbit的MP3,质量也差不多)。如果你的游戏没有音乐或只有一个音轨,以上这一切将不会带给你任何问题,但如果你有超过10个的音乐文件,对压缩设置您要三思而后行,并探寻各种可能性。

    在对音乐文件进行压缩后,文件大小在Xbox目录中约为5-6 MB,在Win目录中约为10 MB(见图9-8)。Rocket Commander游戏XACT项目大小几乎是这个的两倍多,因为它使用了两个音乐文件。在本书的以后几个游戏中使用更多的音乐文件,文件大小也会增长得更多。

    5
    图 9-8

    Sound Banks

    虽然您可以编译该项目加载到您的XNA游戏中,但还不能使用任何声音,因为XACT项目中只包含波形文件。但是要播放声音必须首先建立在一个sound bank。同样你也可以建立多个sound bank,但通常不需要。

    让所有的wav文件工作最简单的办法是将它们拖动到您的sound bank中。但别急,sound bank在哪?您还没有。你必须首先创建它。为此,您可以点击sound bank节点或工具栏上的第二个橙色图标(在wave bank旁边)。新的sound bank命名为“Sound Bank”,如果你只有一个wave bank和一个sound bank,只需保持默认的名字。如果您有多个wave bank或sound bank,最好起一个适当的名称,以便您可以更容易得找到。

    从wave bank拖动所有波形文件到sound bank,你应该将窗口位置设置成可以完整地看到这两个窗口。Sound bank窗口由两部分组成:顶端的sound名称和底部的cue名称。在wave bank中选择所有文件并将它们拖动wound bank的sound名称部分(见图9-9)。在这里每一个声音可以得到更多的设置,如改变音量,频率(音高)或采用其他变量或效果。您可以多次添加相同的波形文件并给予不同声音名称。对于更复杂的游戏你甚至可以在多个音轨中组合几个波形文件并彼此混合,然后用这个“组合”代替单个波形文件。要添加多个音轨只需将另一个文件拖动到顶部,XACT会自动创建第二个音轨。但本章您不会用到这个功能。

    6
    图 9-9

    当你在sound bank编辑声音时应确保音乐(XnaShooterGameMusic)使用Music类别而不是Default(您可以在左侧的sound属性面板中编辑)。因为我想在背景中播放多个音乐,所以通常还使声音更加柔和而不使用默认值。在您的游戏可以使用music类别控制音量。此外,你可能想确保在同一时间只播放一个音乐文件(或者如果你有多个音乐文件,而且你也不想停止并重新启动它们,这时你也可以调用StartMusic方法多次)。

    为了优化音乐播放,你应该把所有要播放的音乐文件放在一个sound bank入口内(例如,MenuMusic和GameMusic,可参见Rocket Commander例子)。当音乐entry被选择时点击sound bank窗口右侧的“Play Wave”。这里您可以强制循环播放,一些声音已经是循环播放了,但对于音乐文件最好能确保它也是循环的。

    最后你要确保同一时间只播放一个音乐文件,如果另一个音乐文件有一个很好的淡出效果也不错。幸运的是,XACT可以为你做这一切。您现在可以为每个音乐文件设置淡入/出持续时间,或者更聪明地设置整个音乐分类(见图9-10)。默认LimitInstances设定为false,一旦你在属性面板中将其设置为true就能激活它。如果您尝试在一个音乐项目开始后再播放其他音乐项目将引发异常,因为BehaviorAtMax设定为FailToPlay。将它改变为Replace可以修正错误。其余的设置见图9-10。

    7
    图 9-10

    Cue变量

    如果你想,你可以再次编译项目,但您的XNA代码还没能处理任何声音效果。XNA只允许访问一个sound cue,它必须首先被创建。这一步很简单,只要选取所有sound的名称并将它们拖动到sound bank窗口的sue部分。名称会自动取自文件名,但你可以重命名。我通常将音乐文件重命名,这样能使在XNA中处理起来轻松点。

    在XNA Shooter中使用的另一个很酷的功能是,你可以将多个声音效果用在一个单一的sound cue上。这个功能可用于爆炸效果。您有三个爆炸波形文件,但为了简化问题,您只想告诉XACT播放一个爆炸声音,它能随机播放其中一个。为了做到这一点,您要从cue列表中删除Explosion2和Explosion3的sound cue,现在将Explosion1 cue重命名为Explosion。最后,将Explosion2和Explosion3拖动到Explosion sound cue上。您现在应该可以看到如图9-11所示。提示:为了让编辑变得更轻松,使sound bank窗口最大化。有时当滚动条出现或消失时,你可能会拖动到错误的位置或错误地重复项目(我就一直发生这种错误)。

    8
    图 9-11

    您可能还注意到我还将游戏音乐sound cue改名为GameMusic,这样能更容易地把它写入XNA代码中。另外,请给其他sound cue也起一个好记的名称。

    再次编译该项目后就可以在XNA中使用XACT项目并存取所有的sound cue了。请注意,您无需总在XACT中编译XACT项目,当你将.xap项目添加游戏项目中时XNA会自动为你编译。或者您也可以只添加编译过的文件并在XNA中自己加载他们。无论采取何种方式,.xap文件无疑是XNA最顺手的解决方案。但是在使用XACT时,我仍建议按F7键编译该项目来测试一个新的单元测试直到它工作正常。

    其他效果

    XACT允许设定其他效果和声音参数,这对3D音效特别有用,你可以为声音效果设置各种参数。结合一些小的定制编程你能做的事情非常强大,如根据玩家的位置改变音效,并自动检测三维几何或空间的声场。如果在水下或玩家被手雷击中,您的引擎也可以扭曲音效。变化的可能性是无穷无尽的。

    对于这个小游戏你不需要任何特殊的效果,但作为一个例子我会向你展示如何创建一个自定义变量,使您可以在运行时改变频率(音高)。在XACT直接改变很简单,但在XNA中你没法直接改变这些设置。你必须首先使cue变量公有,并确保声音能使用这个自定义变量。

    这不仅是为了好玩。对于Rocket Commander和本书最后一部分的游戏你需要这个效果扭曲火箭发动机的声音或根据目前赛车的速度改变赛车发动机的声音。

    要创建新的cue实例变量只需点击“Cue Instance”并从弹出菜单中选择“New Cue Instance Variable”。您可以输入您想要的任何东西和使用任何你喜欢的值,他们还没有绑定任何东西。在这里你调用新的变量pitch并从-100变化到100,其余属性保持不变(见图9-12)。

    9
    图 9-12

    接下来,您必须确保XACT对这些变量做了些有用的事。您可以设定它并将它指派到任意一个声音效果,但在储存这些值之前它什么也不能做。这里您可以使用RPC预置(Runtime Parameter Control)现存的参数,但现在的选择非常有限(你只能改变音量,音高混响电平)。也许将来会有更多的选择。例如,在Rocket Commander XNA中设置panning是不可能的,这只能用在Managed DirectX版本中。如果XACT支持3D音效,那么你可以很容易进行真正的3D声音计算,但不幸的3D listener在初版XNA测试版本中被取消。在XACT中设置3D音效参数是可能的,你可以在本地XACT项目中使用他们,而且XNA并尚不支持(如果您像我以前那样实现过类似的东西,那么在XNA中它们都不会工作,这一点也不好玩)。

    总之,要改变音效的音高,您可以轻松地使用新的RPC预置。只要点击RPC预置,并添加一个新的RPC预设,调用PRC音高或只保留默认名称。选择Sound:Picth作为参数,并使用新创建的Picth变量。现在,你可以拖动下面图表中左,右点使Picth 变量中的-12等于-100和12等于100(见图9-13)。

    10
    图 9-13

    在预设能用来分配所有的声音前你还要使用这个新的变量。为了做到这一点只需将一个声音文件从sound bank(不使用wave或cue,他们无法正常工作)拖动到PRC预置中。

    下面的代码可以用来启动一个sound cue,并动态地改变音高。如果你只需设置一个静态音调值则不用这么麻烦,只需在XACT中建立一个新的cue并设定不同的音高值。但对于发动机的声音你必须动态地改变原有的音高,因此你必须经历这些麻烦。

    rocketCue = soundBank.GetCue("RocketMotor");
    rocketCue.Play();
    // Set the global volume for this category
    motorsCategory.SetVolume(MathHelper.Clamp(volume, 0, 1));
    // Set pitch from -55 to +55 (little more than half the max values)
    rocketCue.SetVariable("Pitch", 55 * MathHelper.Clamp(pitch, -1, 1));

    你马上会看到Sound类的其余部分更容易,您可能会在XACT中花大部分时间,然后在花几分钟时间在编写Sound类上。

    在前面的例子你也看到了改变音量的一种方法。直接改变cue的音量默认不支持,但你可以以您刚刚创建音调变量的同样方式创建一个音量的cue变量。

  • 相关阅读:
    Linux
    memory库函数的实现
    剑指Offer面试题1
    Linux
    Linux-配置vim开发环境
    Linux-Find命令
    busybox,alphine,ubuntu,centos/fedore操作系统
    端口映射与容器互联
    docker 数据管理数据卷
    Celery
  • 原文地址:https://www.cnblogs.com/AlexCheng/p/2120244.html
Copyright © 2020-2023  润新知