XNA高级编程第9章通过 XACT添加声音Word文档格式.docx
- 文档编号:22281317
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:28
- 大小:281.50KB
XNA高级编程第9章通过 XACT添加声音Word文档格式.docx
《XNA高级编程第9章通过 XACT添加声音Word文档格式.docx》由会员分享,可在线阅读,更多相关《XNA高级编程第9章通过 XACT添加声音Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
if(File.Exists(Directories.SoundsDirectory+"
\\"
+filename)==
false)
{
Log.Write("
Sample"
+filename+"
wasnotfound!
"
);
loaded=false;
return;
}//if(File.Exists)
BufferDescriptionbufferDesc=newBufferDescription();
bufferDesc.StaticBuffer=true;
bufferDesc.ControlPan=true;
bufferDesc.ControlVolume=true;
bufferDesc.ControlFrequency=true;
buffer=newSecondaryBuffer[setNumberOfSimultaneousSounds];
channelVolume=newfloat[setNumberOfSimultaneousSounds];
channelPanning=newfloat[setNumberOfSimultaneousSounds];
buffer[0]=newSecondaryBuffer(
Directories.SoundsDirectory+"
+filename,
bufferDesc,
Sound.Device);
defaultFrequency=buffer[0].Frequency;
for(inti=1;
i<
buffer.Length;
i++)
buffer[i]=buffer[0];
try
for(inti=1;
buffer[i]=buffer[0].Clone(Sound.Device);
}//try
catch{}//catch
最后,代码处理播放声音。
借助于Sample类(ControlPan,ControlVolume,ControlFrequency等)的构造函数中的代码您可以设定每个声音缓冲通道的音量和panning。
因为RocketCommander中的Sample类代码很长,所以这里没有显示用来管理所有声音缓冲器和每个声音的属性(音量,panning,频率)的额外代码,如果您有兴趣可以去看原始代码。
//Makesuretostartatposition0
buffer[currentBufferNum].SetCurrentPosition(0);
//Andplaythesound
buffer[currentBufferNum].Play(0,BufferPlayFlags.Default);
在XNA中你不再需要Sample类,你可以扩展Sound类以支持你需要的一切,包括MusicManager,Sample类和RocketCommander中的Sound命名空间的其他东西。
由于XACT的结构(这将在下面讨论),你必须自己加载XACT项目、wave和soundbanks。
但不必担心,代码非常简单。
audioEngine=newAudioEngine("
YourSoundProject.xgs"
waveBank=newWaveBank(audioEngine,"
WaveBank.xwb"
soundBank=newSoundBank(audioEngine,"
SoundBank.xsb"
就是这些,你要做的只是调用它:
soundBank.PlayCue(soundName);
看起来很容易,不是吗?
您可能会要求DirectSound中的额外功能。
它们没有丢失,但在XNA中处理声音的思路不一样。
声音文件已不再完全由自定义代码管理,作为替代,XACT声音项目包含了所有预定义的声音参数。
你无需自己修改每个声音的音量或音调,你可以在XACT工具中处理这一切。
这对确保所有的声音有相同的音量,并确保声音不是太大是很有用的。
你可以指定某些声音只被允许播放一次(如背景音乐),为开火或爆炸播放相同声音的多个实例。
您将在本章后面学到更多的相关知识。
处理.wav文件
DirectSound和XACT都要求声音文件必须是.wav格式。
如果您有其他格式的声音文件则必须首先进行转换。
例如,MP3文件不被支持,你不能在DirectSound播放它们或简单地把它们拖动到您的XACT项目中。
你必须首先转换为.wav文件。
另请注意,在XACT中某些特定的.wav文件不被支持,当你添加声音文件到wavebank时将获得一个警告讯息告知格式不支持。
确保一个音乐文件的格式是正确的,并在XACT中以最佳途径压缩不是很容易(见图9-1)。
图9-1
您要将声音文件都转换成16位44千赫立体声的PCMwav文件以确保可以压缩它们。
如果音乐只有单声道,你还必须将它保存为立体声,如果您有8-bit的PCM文件,那就不要尝试去使用它们。
一定要转换为16bit和立体声,否则XACT不会允许你正确地压缩声音文件。
对于8bit文件你会得到如图9-2所示的错误讯息,而单声道文件压缩得不好。
压缩时16bit立体声文件会损失一些音质,但选择正确的XMA和ADPCM压缩级别会让这种损失降到最小。
图9-2
请注意,XACT并不真正支持音乐文件,它更擅长处理音效文件。
在PC平台上,如果你有MP3音乐文件,那么使用ADPCM编码可能没有多大意义,而且已经有一些代码可以播放它们。
但在Xbox360平台上,您目前别无选择,只能使用XMA压缩和XACT。
音效文件也可以被压缩,但我建议您尝试使用高压缩比。
对于PC游戏使用高度压缩的声音文件是非常少见的,通常使用低音质的文件(22KHz单声道),因为这样载入更快,使用MP3文件是不切实际的,因为这样做将使CPU在每次播放声音时解压缩或者在游戏开始时解压缩,这可能需要占用一段时间。
在大多数情况下,增加了一些额外的MB到您的游戏不会影响很大,但如果你想和我一样确保游戏尽可能小而不丧失任何功能或任何质量下降,你仍将尝试压缩所有文件直到一切足够小但仍听起来不错。
我还压缩本书中所有游戏使用到的所有纹理,使用不同的格式以找出一个最佳的格式。
例如,菜单和图形界面使用PNG格式,因为它以无损方式储存点阵图,但对模型纹理或场景纹理来说png文件太大。
在这种情况下使用DDS格式,这也有利于节省显存,这对Xbox360来说是很重要的。
不要浪费你的主内存,磁盘空间或显存——它们在游戏机平台上是宝贵的。
例如,RocketCommander游戏使用了约15个声音文件(见图9-3),使用了压缩使得小了大约1MB。
图9-3
基本知识和文件格式讲完了,下面您将在XACT中创建首个声音项目了。
9.2使用XACT
XACT曾经是一个只提供给Xbox360开发者的工具,你不能轻易地得到它。
您必须是一个经验证的Xbox360开发者,并获得XDK(Xbox开发工具包)。
即使你是一个专业的游戏开发者并从业多年,这也不是一件容易的事情。
但是,现在已经发生了变化。
一年前微软决定在DirectXSDK包含XACT,虽然在PC游戏上用得不多,但这对XNA游戏开发是很重要的,因为这是在Xbox360上使用XNA播放声音的唯一办法。
您不必安装DirectXSDK就能使用XACT工具,它已经包含在XNAGSE安装文件中了。
您可以在开始-所有程序-MicrosoftXNAGameStudioExpress-Tools-XACTAuditioningUtility中找到它。
如果您使用另一个版本的XACT请确保它支持XNA,例如,2006年8月的DirectXSDK已包含了XACT2.0,但它将内容文件保存为4.0版本。
而2006年10月的DirectXSDK和XNA框架使用4.1版本,与之前的版本不兼容。
如果您加载旧的XACT项目可能会出现非常奇怪的错误,如文件丢失或提示InvalidOperationException错误。
未来的版本也可能有所不同,为了确保您的XACT项目能被支持,请检查.xap文件的版本(.xap只是一个简单的文本文件,你可以用任何文本编辑器打开它)。
.xap文件的结构很简单,看起来类似xml文件。
但版本号有点混乱,你要确保是13版(即XACT工具的4.1版,这可在关于对话框中看到,见图9-4)。
像11或12的老版本(在老的DirectX软件开发工具包中)不被支持。
这个问题会发生在打开一个早期XNA测试版本(2006年8月至10月之间)时,测试版本仍然使用旧的XACT工具。
图9-4
Signature=XACT2;
Version=13;
Options
}
GlobalSettings
[...]
如果您只想在VisualStudio的XACT项目内改变一个简单的值,如音量大小,只需在VisualStudio的文本编辑器打开.xap文件,找到储存音量的位置并改变它就可以了。
对于游戏开发者来说最好有专人负责音效和音乐。
让他学会使用XACT工具,你就不用关心声音,音量和格式的问题了。
但不幸的是,大多数小团队没有专人负责声音,如果你要全部自己实现,那么除了要制作图形及其他游戏内容文件,您也将制作自己的声音效果。
一开始可以利用现成的音效或免费提供的声音。
可选用类似的音乐,可以从你的MP3库中找,最终版本您需要自己的音乐,当然,你不能只用别人的音乐。
一些音乐文件都是免费使用的,但大多数音乐都不是免费的。
获取音效文件比较容易,对于一些简单的音效你也可以本书中的音效文件。
如果你没有音效文件或没人可以帮你,我建议你在互联网上寻找免费音效的网站。
为了让事情变得更有趣,你将要为这本书第三部分最后的一个游戏——XnaShooter创建sound项目,XnaShooter是一个简单的射击游戏,有很酷的三维图形、声音效果并支持键盘,鼠标和Xbox360手柄(将在下一章详细讨论)。
创建项目
当您打开XACT工具,您将看到一个新的空项目(见图9-5)。
它不包含任何声音文件,wave或soundbank,但创建新项目时某些变量和设置已经创建了:
●项目树目录,它总是包含相同的根节点。
你不能改变它。
●两种默认类别:
Default和Music,它可以将声音文件标记为音效或音乐,这两种文件行为是不同的。
●一个全局变量,SpeedOfSound,长度始终是343.5和4个cue实例变量,多普勒频移,Cue实例数量,定位角。
所有这些变量只对3D声音来说才是重要的,但在XNA中3D音效不被支持。
当你编写代码来播放音效时会详细讨论这个议题。
●一个全局effect路径,现在没有任何东西。
●其他根节点是空的。
你必须自己创建子节点,可以单击工具栏或右键点击节点并选择New。
例如,“NewWaveBank”创建一个新的wavebank。
图9-5
要将wav文件导入到新的XACT项目中你必须首先建立一个wavebank,它储存了所有wav文件,然后加载并被你的游戏使用。
不仅仅是加载wav文件,还要做大量的其他工作,XACT能使音效艺术家在设置各种参数时有更多的灵活性。
当你必须自己实现XACT项目时帮助不大,但至少XACT能让您的项目可以更好地组织声音文件,你能知道在哪可以改变声音的参数,而不需要进入游戏代码。
使用XACT的缺点是,你不能动态加载声音文件,所有内容的文件(如编译模式)必须在启动游戏时被创建和加载,当游戏运行时就不能再添加东西了。
一开始这让我很恼火,因为我喜欢在编写和调试游戏时添加动态的东西,但一旦习惯了,这也很不错。
现在,我在项目早些时候就创建所有声音文件,并只使用单元测试中已有的声音。
以后sound项目会被不断地修改。
创建wavebank
要创建一个wavebank,您可以右击wavebank,并选择“NewWaveBank”,或者您也可以使用工具栏创建一个wavebank(第八个选项,橙白相间的图标,见图9-5)。
Wavebank仅储存使用到的所有声音文件。
你可以有不同的wavebank,举例来说,如果游戏中有多个关卡,你只需要载入当前关卡的wavebank,通过这种方式可以分离波形文件并优化您的游戏。
这本书的所有项目和我曾经制作过的其他项目只包含一个wavebank,相对于分割音乐和音效以支持流媒体,我认为拥有多个wavebank不是很重要,你可能永远都用不到。
在创建好自己的wavebank后,您就可以拖放wav文件到wavebank或者使用右键菜单选择“InsertWaveFiles”。
图9-6显示了XnaShooter游戏将要使用到的所有声音文件。
图9-6
如您所见,所有的声音文件仍然未被使用,用红色的斜体显示。
一旦您将这些波形文件添加到sound,它们会变成绿色。
但在此之前,你应该确保所有的文件都有正确的设置。
默认情况下没有选择压缩,除了音乐文件大多数声音文件都相当小,所有的音效文件都小于1MB。
音乐文件占用了高达36MB的磁盘空间,长3.5分钟,并以前面讨论过的格式(16位44KHz的立体声的PCM)储存。
如果你想压缩的音乐文件,请在wave属性面板中单击它并选择您想要的压缩预置。
目前显示为<
none>
,但如果你点击下拉列表,其中并没有其他选项。
你必须首先创建一个压缩预置然后才可以使用它。
XACT工作原理与其他预置类似。
例如,如果你想为音效创建一个自定义变量,你必须首先在变量部分创建它,然后才可以在soundbank中选择并使用它。
音乐数据压缩
要创建一个新的压缩预置可以单击左边树目录中的CompressionPresets并选择“NewCompressionPreset”(见图9-7)。
现在输入一个名称,你只是想创建一个音乐文件压缩架构。
Notes部分不会在XACT工具的外部使用,只是给你一个简单的注释。
其他面板没有Notes部分和不需要的可选参数。
您可能会在第一次使用XACT时感到困惑。
一开始我不喜欢它,但过了一段时间后就会习惯,你必须记住,这是在Xbox360和XNA播放声音的唯一办法。
如果您创建一个只能在Windows运行的游戏,您仍然可以使用DirectSound或其它声音引擎,也许这样使用起来更简单或有其他优点。
最后,用每块128个样本(默认值)设置Windows压缩(只能用于ADPCM)。
更高的值会使文件更小,但质量会下降。
每块32个样本是最高的ADPCM质量,但文件会增大约30%。
图9-7
Xbox360上您只能选择XMA,但压缩率好很多。
你可能会问,当你只能选择一钟压缩时却有这么多的选项。
好吧,希望将来能获得更多的压缩格式。
XMA对Xbox360来说很好,但有时它产生的文件有点大,但它听起来音质很好。
但在Windows平台上ADPCM无法使用。
它音质不如MP3文件,而且大小是MP3的4-5倍。
若支持WMA或MP3一定会很棒。
不幸的是,XACT不会即时显示所产生的XMA文件的大小。
你必须首先编译该项目,才会告诉您XMA格式的波形文件被压缩了多少。
要编译该项目,您可以点击工具栏的最后一个按钮或按下F7。
默认情况下,该项目将编译为Windows平台,您仍然没法看到XMA压缩的结果。
你必须在View菜单中切换到Xbox360output然后编译XACT项目,这样wavebank将显示Xbox360上的文件大小(PC压缩率始终会显示,它们总是同一比率,27%是默认的ADPCM的设置)。
下表显示了XnaShooterGameMusic.wav文件的压缩比(未压缩时有36MB)。
压缩
文件大小
压缩率
未压缩
36MB
100%
192kbit的MP3
4.8MB
13%
128kbit的MP3
3.1MB
8.5%
48kbit的AccPlus,类似192kbit的MP3
1.2MB
3%
24kbit的AccPlus,类似96kbit的MP3
0.6MB
1.6%
160kbit的OGG
3.8MB
11%
XACTADPCM32samplesperblock
12.5MB
34%
XACTADPCM128samplesperblock(default)
9.9MB
27%
XACTADPCM512samplesperblock
9.3MB
26%
XACTXMA100%Quality
14.3MB
40%
XACTXMA90%Quality
8.9MB
25%
XACTXMA75%Quality
5.5MB
15%
XACTXMA60%Quality(默认值)
4.7MB
XACTXMA30%Quality
3.5MB
10%
XACTXMA10%Quality
2.9MB
8%
低质量的XMA文件在大小上与MP3相当,但是质量更糟。
我不会推荐使用非常低压缩设置的XMA文件。
使用50%或更高,文件的大小仍然接近于60%(默认设置)和75%(我最喜爱的设置),因为对于高质量设置来说,文件仍保持非常小(低于15%,类似于192kbit的MP3,质量也差不多)。
如果你的游戏没有音乐或只有一个音轨,以上这一切将不会带给你任何问题,但如果你有超过10个的音乐文件,对压缩设置您要三思而后行,并探寻各种可能性。
在对音乐文件进行压缩后,文件大小在Xbox目录中约为5-6MB,在Win目录中约为10MB(见图9-8)。
RocketCommander游戏XACT项目大小几乎是这个的两倍多,因为它使用了两个音乐文件。
在本书的以后几个游戏中使用更多的音乐文件,文件大小也会增长得更多。
图9-8
SoundBanks
虽然您可以编译该项目加载到您的XNA游戏中,但还不能使用任何声音,因为XACT项目中只包含波形文件。
但是要播放声音必须首先建立在一个soundbank。
同样你也可以建立多个soundbank,但通常不需要。
让所有的wav文件工作最简单的办法是将它们拖动到您的soundbank中。
但别急,soundbank在哪?
您还没有。
你必须首先创建它。
为此,您可以点击soundbank节点或工具栏上的第二个橙色图标(在wavebank旁边)。
新的soundbank命名为“SoundBank”,如果你只有一个wavebank和一个soundbank,只需保持默认的名字。
如果您有多个wavebank或soundbank,最好起一个适当的名称,以便您可以更容易得找到。
从wavebank拖动所有波形文件到soundbank,你应该将窗口位置设置成可以完整地看到这两个窗口。
Soundbank窗口由两部分组成:
顶端的sound名称和底部的cue名称。
在wavebank中选择所有文件并将它们拖动woundbank的sound名称部分(见图9-9)。
在这里每一个声音可以得到更多的设置,如改变音量,频率(音高)或采用其他变量或效果。
您可以多次添加相同的波形文件并给予不同声音名称。
对于更复杂的游戏你甚至可以在多个音轨中组合几个波形文件并彼此混合,然后用这个“组合”代替单个波形文件。
要添加多个音轨只需将另一个文件拖动到顶部,XACT会自动创建第二个音轨。
但本章您不会用到这个功能。
图9-9
当你在soundbank编辑声音时应确保音乐(XnaShooterGameMusic)使用Music类别而不是Default(您可以在左侧的sound属性面板中编辑)。
因为我想在背景中播放多个音乐,所以通常还使声音更加柔和而不使用默认值。
在您的游戏可以使用music类别控制音量。
此外,你可能想确保在同一时间只播放一个音乐文件(或者如果你有多个音乐文件,而且你也不想停止并重新启动它们,这时你也可以调用StartMusic方法多
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- XNA高级编程第9章通过 XACT添加声音 XNA 高级 编程 通过 XACT 添加 声音
![提示](https://static.bdocx.com/images/bang_tan.gif)