zoukankan      html  css  js  c++  java
  • [翻译]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
    (完)
  • 相关阅读:
    linux of函数实例
    Linux libenv 编译移植
    OpenTracing简单了解
    Byte Buddy简单学习
    JavaAgent简单学习
    TB2安装ubuntu16.04+kinetic的ROS包
    常用工具传送门
    ROS传送门
    结对第二次—文献摘要热词统计及进阶需求
    结对第一次—原型设计(文献摘要热词统计)
  • 原文地址:https://www.cnblogs.com/315358525/p/1559377.html
Copyright © 2011-2022 走看看