[翻译]XNA 3.0 Game Programming Recipes之fifty


PS:自己翻译的,转载请著明出处

                                                            7-3 通过XACT播放简单的.wav声音文件
问题
                                  你想加载一个声音效果通过XACT,并且播放它在你的游戏中。
注意:Zune不支持XACT工具;因此,相关内容在7-1节和7-2节去学习如何播放声音在Zune上。
解决方案
                                  通过使用XACT,一个免费的工具,它来自XNA Game Studio3.0,你可以创建一个XACT工程,它包含所有的你准备在游戏中使用的声音文件。你可以使用XACT去可视化的添加/操作效果。你可以导入这个XACT项目到你的XNA工程中,在它可以立即播放声音保存在你的XACT项目中使用一个单一的代码行。
它是如何工作的
                                  首先,确保你打开一个XNA项目并且保存它在你的硬盘上。为了保持这些东西有序,你应该创建一个新的文件夹去保存所有你的声音原料。在XNA项目的解决方案中,找到Content条目,右击它,选择Add-New Folder,并且命名你的文件夹Audio,列如。
                                  现在,打开XACT通过点击Start菜单,然后点击Programs-Microsoft XNA Game Studio3.0-Tools-MicrosoftCross-Platform Audio Creation Tool(XACT)
                                  当你开始XACT,首先的事情你需要去做的是开始一个新的项目通过选择File-New Project.给你的项目一个奇妙的名字,并且浏览到你的XNA的Content\Audio路径保存它。
                                  你将会看到一个空的项目。在左边的树型结构中,找到Wave Banks,它包含waves,它是一个音频文件。右击Wave Banks,并选择New Wave Bank.接下来,创建一个声音bank通过右击Sound Banks并选择New Sound Bank.一个sound bank包含sounds,它是一个对象,他实际上可以在你的XNA项目中播放。一个声音指向一个波形,并且可以随意添加一些波形的效果类型。
                                  你现在可以看见两个长方块在你的窗口右边。点击Wave Bank框体。你应该可以看见它的属性在XACT窗口的底部。找到Name属性,并且改变它从Wave Bank为myWaveBank.接下来,点击Sound Bank框体,并且命名它的Name属性为mySoundBank.这些名字通过它们在你的XNA项目中容易被理解。
                                  你可以使用你的波形bank去保存所有你的.wav文件,所以右击它的框体的某处,并选择Insert WaveFile(s).浏览到.wav文件在你的硬盘中,它是你想在你的游戏中播放的,打开它。你可以看见它已经添加到你的波形bank.它显示为红色,因为你还没有使一个声音在你的声音bank中,它使用波形。
提示:该文件的位置被保存在相对的XACT项目中。这可以导致麻烦如果你改变你的声音或者你的XACT项目的位置,所以你应该首先复制音频文件到Content\Audio路径在导入它们到你的wave bank。
                                  一个波形是一个相关于声音文件在你的硬盘中,不管文件是什么样的格式。一个声音使用一个波形并且允许你去添加一些类型效果到它里面,如处理音量或者pitch。你可以使多个声音来自于一个波形。虽然,程序员使用一个cue去访问这些声音。所以从每个声音中,你需要产生一个cue在你可以从你的XNA代码去访问它时。一个cue可以包含多个声音,所以一个单一的代码行可以播放多个声音。
                                  所以,在你可以从你的游戏中的波形bank播放一个波形之前,你需要去制造一个声音和一个cue,他们用这个波形。你可以通过选择你的波形和拖放它到你的Sound Bank框体的cue地方,如图7-1所显示。
提示:确保你立即拖拉声音到cue表单在Sound Bank框体的底部,不是到声音表单,而在Sound Bank框体的上部。
                                  这波形和声音banks被分为独立的实体,这样你可以使从单一的波形中得到多个声音。这样,你可以添加不同的效果到涉及同一个波形的不同的声音中去。

                                  这是它的XACT工具;确保你通过选择File-Save Project.保存你的项目。到你的XNA项目中,并且导入这个文件到你的XNA项目文件,就象你导入一个图象或者对象文件一样。你可以通过拖拉.xap文件到Content\Audio条目来实现,在你的XNA Game Studio 3.0的解决方案或者通过到你的解决方案浏览器,右击Audio条目,并选择Add-Existing Item.
                                  目前,myXactProject.xap文件应该被列在你的XNA Game Studio3.0程序的解决方案中。
                                  当你编译你的工程,这个XACT项目将会被读并且转化成二进制文件,它将会被写如你的项目输出文件。每个.xapXACT项目文件,你添加到你的XNA项目中,XNA内容管道将创建一个.xgsXNA游戏的声音二进制文件(与XACT项目同名),一个在你项目的每个波形bank.xwb二进制文件和在你的XACT项目的声音bank一个.xsb二进制文件。
                                  在你的XNA项目,你需要去连接三个文件中的每一个成为一个变量,这样,首先声明他们在你的代码的开头:
1 AudioEngine audioEngine;
2 WaveBank waveBank;
3 SoundBank soundBank;
                                  然后连接他们到二进制文件(它将创建/更新当你编译你的项目时).列如,在Initialize方法中:
1 audioEngine=new AudioEngine("Content/Audio/MyXACTproject.xgs");
2 waveBank=new WaveBank(audioEngine,"Content/Audio/myWaveBank.xwb");
3 soundBank=new SoundBank(audioEngine,"Content/Audio/mySoundBank.xsb");
                                  soundBank变量将包含所有的可演奏的cues.虽然,当你实例化一个新SoundBank,你需要去传递它一个AudioEngine,所以你需要去初始化这个首先。不关你播放一个cue从你的soundBank中,它将查找波形从WaveBank联合它的AudioEngine,所以你同样需要第二行。
注意:myWaveBank和mySoundBank名称将通过你在前面这章的XACT工具来分配。
                                  现在,当你想简单的播放一个声音,所有你不得不去做是调用soundBank变量的PlayCue方法,并且传递它你想播放的cue的名字!
                                 为了确保所有的cues从内存中删除,当它们已经完成时,确保你调用你的audioEngine每一祯的Update方法:
1 audioEngine.Update();

注意:不管你改变到你的XACT项目并且保存它成一个文件,你不能简单运行你的XNA项目的这个.exe,并且期望它去应用这个改变,你在你的XNA项目
中产生的。你首先需要去重新编译(每次按F5完成)你的XNA项目,这样内容管道创建新的二进制文件从你的XACT项目中。

代码
                                 你需要三个全局变量通过它,你可以播放所有你包含的的声音cues在你的XACT项目中:

1 AudioEngine audioEngine;
2 WaveBank waveBank;
3 SoundBank soundBank;
                                 初始化它们在你的项目开始时:

 

1 protected override void Initialize()
2 {
3     audioEngine=new AudioEngine("myXactProject.xgs");
4     waveBank=new WaveBank(audioEngine,"myWaveBank.xwb");
5     soundBank=new SoundBank(audioEngine,"mySoundBank.xsb");
6     base.Initialize();
7 }
                                 播放声音使用soundBank.PlayCue方法,例如在一个键被压下时,如下面代码所展示。确保调用audioEngine.Update方法每一祯:
 1 protected override void Update(GameTime gameTime)
 2 {
 3       if(GamePad.GetState(PlayerIndex.One).Buttons.Back==ButtonState.Pressed)
 4              this.Exit();
 5       KeyboardState keyState=Keyboard.GetState();
 6       if(keybState.IsKeyDown(Key.Space))
 7           soundBank.PlayCue("audio1");
 8       audioEngine.Update();
 9       base.Update(gameTime);
10 }
                                 现在当你运行这段代码,这个声音将会在你每次压下空格键后播放。
源代码:http://shiba.hpe.cn/jiaoyanzu/WULI/soft/xna.aspx?classId=4
(完)

posted on 2009-09-03 11:00  一盘散沙  阅读(247)  评论(0编辑  收藏  举报

导航