问题

你想在游戏中播放声音。

注意:Zune不支持Xact,所以参见教程7-1和7-2学习如何在Zune上播放声音。

解决方案

通过使用Xact,一个XNA Game Studio 3.0自带的免费工具,你可以创建包含游戏中使用的所有声音的Xact项目。你可以将这个Xact项目导入到XNA项目中,这样就可以使用一行简单的代码播放存储在XAct项目中的声音。

工作原理

首先,确保你已经打开了一个XNA项目并存储到了磁盘中的某处。要更好的组织素材,你应该创建一个新文件夹存储所有的声音素材。在XNA项目的Solution Explorer中,找到Content,右击它,选择Add→New Folder,起一个名称。

现在通过点击Start菜单并点击Programs→Microsoft XNA Game Studio 30→Tools→ Microsoft Cross-Platform Audio Creation Tool (XAct)打开Xact。

当开始Xact时,你要做的第一件事就是通过选择File→New Project开始一个新项目,给你的项目起一个名称,并将它保存到XNA项目的Content\Audio目录中。

现在有了一个新的空项目,在左边的树形目录中,找到Wave Banks,它包含了waves,即音频文件。右击Wave Banks选择New Wave Bank。然后,通过右击Sound Banks选择New Sound Bank创建一个新的sound bank,sound bank包含声音,它们是在XNA项目中实际播放的对象。一个sound指向一个wave,可以在wave上添加一些效果。

现在在窗口的右边应该有两个面板。点击Wave Bank面板,你应该可以在Xact窗口的左下角看到它的属性。找到Name属性,将它从Wave Bank改为myWaveBank。然后,点击Sound Bank面板,将Name属性改为mySoundBank。这些名称可以从XNA项目中访问到。

你可以使用wave bank存储所有. wav文件,所以右击面板的某处选择Insert Wave File(s)。浏览到磁盘上你想在游戏中播放的. wav文件,点击Open。你可以看到它被添加到了wave bank中,显示为红色,因为你还没有在sound bank中创建一个sound 使用这个wave。

技巧:文件的位置是相对于Xact项目存储的。如果你改变了声音文件的位置或Xact项目的位置就会遇到麻烦,所以在将声音文件导入到wave bank前先将它们复制到Content\Audio目录中。

一个wave是磁盘上一个声音文件的引用,一个sound使用一个wave让你可以添加一些效果,诸如改变音量和音高。从一个wave你可以生成多个sound。但是,程序员使用一个cue访问sound。所以对每个sound,在可以通过XNA代码访问前需要创建一个cue。一个cue可以包含多个声音,所以一行代码可以播放多个声音。

所以,在可以从wave bank播放一个wave前,你需要创建一个sound和使用这个wave的cue,这可以通过选择wave并拖动到Sound Bank面板的cue区域做到,如图7-1所示。

当心:确保将sound拖动到Sound Bank面板底部的cue列表中,而不是顶部的sound列表。

wave bank和sound bank是分离的,这样你可以从一个wave文件创建多个sound,通过这种方式,你可以在同一个wave上在不同的sound上添加不同的音效。

图7-1 将你的wave拖动到cue区域

这就是Xact工具的用法,别忘了通过选择File→Save Projec保存项目,并将文件导入到XNA项目中,方法和导入一张图像或对象文件是一样的。你可以将. xap 文件拖动到Content\Audio文件夹上,或在Solution Explorer中右击Audio文件夹并选择Add→Existing Item。

myXactProject. Xap文件会立刻显示在XNA Game Studio 3.0程序的Solution Explorer中。

当编译项目时,Xact项目会被读取并转换为二进制文件,这个二进制文件会被写入到项目的输出文件夹中。对添加到XNA项目的每个. xap Xact项目文件,XNA内容管道会创建一个. xgs二进制文件(与Xact项目的名称相同),为每个wave bank创建一个. xwb二进制文件,为每个sound bank 创建一个. xsb二进制文件。

在XNA项目中,你需要将这三个文件连接到对应的变量中,首先在代码顶部进行声明:

AudioEngine audioEngine;
WaveBank waveBank;
SoundBank soundBank; 

然后将它们连接到二进制文件(它们是在你编译项目时创建/更新的),例如,在Initialize方法中:

audioEngine = new AudioEngine("Content/Audio/MyXACTproject.xgs");
waveBank = new WaveBank(audioEngine, "Content/Audio/myWaveBank.xwb");
soundBank = new SoundBank(audioEngine, "Content/Audio/mySoundBank.xsb");

变量soundBank包含所有可以播放的cue。但是,当你实例化一个新的SoundBank时,需要将它传递到一个AudioEngine,所以首先需要初始化AudioEngine。只要你从soundBank播放一个cue,它就会从AudioEngine对应的waveBank中找到wave,所以你需要第二行代码。

注意:myWaveBank和mySoundBank的名称是在Xact工具中命名的。

现在,当你想播放一个简单的声音时,你要做的就是调用soundBank变量的PlayCue方法,将要播放的cue名称传递到这个方法中!

soundBank.PlayCue("audio1"); 

当播放结束要确保所有cue从内存中移除,所以要在每一帧都调用 audioEngine的Update方法:

audioEngine.Update(); 

当心:当你改变了Xact项目并存储到文件后,你无法简单地运行XNA项目的. exe指望它将这个改变施加到Xact项目中。首先需要重新编译(按F5)XNA项目使内容管道从Xact项目中创建新的二进制文件。

代码

你需要通过全局变量播放包含在Xact项目中的声音cue:

AudioEngine audioEngine;
WaveBank waveBank;
SoundBank soundBank; 

在项目的开始处进行初始化:

protected override void Initialize()
...{audioEngine = new AudioEngine("myXactProject.xgs"); waveBank = new WaveBank(audioEngine, "myWaveBank.xwb"); soundBank = new SoundBank(audioEngine, "mySoundBank.xsb"); base.Initialize();
}

使用soundBank. PlayCue方法播放声音,例如下面代码中在按下一个键时播放声音。确保每一帧调用audioEngine. Update方法:

protected override void Update(GameTime gameTime)
...{if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit();KeyboardState keybState = Keyboard.GetState(); if (keybState.IsKeyDown(Keys.Space)) soundBank.PlayCue("audio1");audioEngine.Update();base.Update(gameTime);
}

现在当运行代码时,当你按下空格键时就会播放声音。

转载于:https://www.cnblogs.com/AlexCheng/archive/2011/03/03/2120089.html

在XNA 3.0 项目添加声音——通过Xact播放简单的.wav文件相关推荐

  1. 在XNA 3.0 项目添加声音——播放MP3或WMA声音文件

    问题 你想在XNA游戏中播放一个MP3或WMA声音文件. 解决方案 XNA可以使用默认内容管道将MP3或WMA声音文件加载到一个Song对象中,加载之后,就可以使用静态的MediaPlayer类播放S ...

  2. springboot2.0项目(课程管理系统,系统简单,技术含量高)

    课程管理系统是基于springboot2.0来实现了,springboot是spring在发展史上的一个重大框架,它大大简化了spring的配置,而今年springboot重大升级,出现了spring ...

  3. [翻译]XNA 3.0 Game Programming Recipes之forty-eight

    PS:自己翻译的,转载请著明出处                                                                    7-1 播放,控制简单的.wav ...

  4. [翻译]Oreilly.Learning.XNA.3.0之eight

    PS:自己翻译的,转载请著明出处                                                                  第十七章   多人游戏        ...

  5. Learning XNA 3.0翻译连载--序言

    译者:林公子 出处:木木的二进制人生 转载请注明作者和出处,谢谢! 序言 过去的几年我一直在纽蒙特大学教授DirectX和XNA游戏开发课程,并且我再三的对自己没能找到适合这些课程的书籍而觉得失落.有 ...

  6. android应用中为按键添加声音

    为程序的按钮添加按键声音能更好的亲和用户,产生更好的使用体验,下面就是为按键添加声音的方法: [java] view plaincopy public class MainActivity exten ...

  7. android 添加点击声音,Android如何为按键添加声音

    为程序的按钮添加按键声音能更好的亲和用户,产生更好的使用体验,下面就是为按键添加声音的方法: public class MainActivity extends Activity { private ...

  8. 使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目

    使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目 一:创建项目,并添加相应依赖 新建Project,并指定Project为Spring Initializr ...

  9. VC 6.0中添加库文件和头文件

    VC 6.0中添加库文件和头文件 分类: VC/VS 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Incl ...

最新文章

  1. 骚操作!阿里云直接买www.huaweicloud.com的关键词来抢生意?
  2. mysql条件填充命令_mysql的简单命令
  3. WEBLOGIC 内存溢出 解决方案
  4. 克隆ubuntu硬盘_使用Ubuntu Live CD克隆硬盘
  5. Keras框架:Alexnet网络代码实现
  6. Java web后端5 JSP技术
  7. 【GIT 基础篇六】分支管理(创建与合并)
  8. service注入为null_如何解决quartz调度时候,job中的service为null的问题?
  9. MiniO 磁盘缓存快速入门
  10. linux打包java jar_在linux环境下修改可运行jar包配置并重新打包
  11. 成都python数据分析师培训_python数据分析师
  12. 不同级别的Java开发人员的应聘要求
  13. 7-23 哥尼斯堡的“七桥问题”(25 分)
  14. python停用词_python利用jieba分词进行分词,去停止词(停用词)。
  15. 梦幻内存辅助制作教程
  16. 声效表达在游戏沉浸方面的影响力
  17. Stratified Transformer复现和调试记录,ubuntu20复现S3DIS数据集(点云语义分割)
  18. 一文彻底学会Redis主从复制(高可用)
  19. 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架
  20. eslint 换行_预计的换行符是apos;LFapos;,但在Eslint中使用gulp发现apos;CRLFapos;换行符 Dovov编程网...

热门文章

  1. LuaForUnity4:Lua的函数
  2. 牛客小白月赛9: div.2 A(线性筛)
  3. Wannafly挑战赛19:C. 多彩的树(状压+容斥)
  4. CQUOJ月赛(5月)H题:zzblack与斐波那契数列
  5. [python + debug] set()操作对象的元素为字符串,则结果随机排序,使用sorted()函数以固定顺序
  6. Kubernetes RBAC 详解
  7. python数据分析系列教程——Pandas全解
  8. Python实现对于文件的分类
  9. zedboard的DDR3型号MT41K128M16HA
  10. TE和TM主模式的介绍