Download presentation
Presentation is loading. Please wait.
1
2D / 3D 遊戲程式設計入門 使用 XNA 3.0 與 C# 第七章 音樂音效
2
本章目的 介紹如何在XNA中使用音樂音效 熟悉XACT開發工具的入門操作 熟悉XNA 3.0簡單的音樂音效播放方式
3
7.1 XACT工具 Cross-Platform Audio Creation Tool 用來產生音效專案相關檔案以供XNA專案使用
『開始』『所有程式』『Microsoft XNA Game Studio 3.0』『Tools』『Microsoft Cross-Platform Audio Creation Tool (XACT)』
4
XACT視窗畫面
5
新增一個XACT專案
6
新增一個Wave 檔案倉庫 Wave 檔案倉庫 (Wave Bank) 可以用來儲存多個音樂音效會使用到的Wave 檔案
7
加入Wave 檔案到 Wave Bank
8
聲音倉庫 (Sound Bank) 聲音倉庫 (Sound Bank) 可以用來儲存多組聲音實體
9
聲音倉庫 (Sound Bank)
10
新增聲音實體 要新增聲音實體只要把在Wave Bank中的Wave檔案拖曳入Sound Bank視窗的左下角子「Cue Name」區塊下
11
建立音效音樂相關檔案 在Win目錄下會產生三個檔案 .xgs (XNA global setting 通用設定檔)
.xsb (XNA sound bank 檔) .xwb (XNA wave bank 檔)。
12
7.2 XNA 加入 XACT專案
13
加入XACT專案中所使用到的Wave 檔案
14
XNA 加入 XACT專案
15
7.3 範例一:實作一個音效類別 『專案』『加入類別』 選擇『類別』,並將此類別名稱設為MyAudio.cs
16
7.3 範例一:實作一個音效類別 //MyAudio.cs using Microsoft.Xna.Framework.Audio;
namespace WindowsGame1 { class MyAudio { AudioEngine ae; // 音效引擎 WaveBank wb; // Wave 檔案倉庫 (Wave Bank) SoundBank sb; // 聲音倉庫 (Sound Bank) public MyAudio() // constructor { //讀入Content中的檔案 ae = new AudioEngine("Content\\MyAudio.xgs"); wb = new WaveBank(ae, "Content\\Wave Bank.xwb"); sb = new SoundBank(ae, "Content\\Sound Bank.xsb"); } //播放音效 public void PlaySound(string name) { sb.PlayCue(name); } } }
17
XNA 程式的聲音物件和XACT 專案檔案關係圖
18
SoundBank物件和Cue物件關係圖
19
7.3 範例一:實作一個音效類別 //Game1.cs namespace WindowsGame1
{ public class Game1 : Microsoft.Xna.Framework.Game { ………. MyAudio audio; // 音效類別 public Game1() { ….. audio = new MyAudio(); // 建立audio } …………………..
20
7.3 範例一:實作一個音效類別 //Game1.cs
protected override void Update(GameTime gameTime) { if (mySprite1.Collides(mySprite2)) { Vector2 tempVelocity = mySprite1.velocity; mySprite1.velocity = mySprite2.velocity; mySprite2.velocity = tempVelocity; audio.PlaySound(“chimes”);//圖片在碰撞時產生音效 } base.Update(gameTime);
21
7.4 範例二:背景音樂 //MyAudio.cs using Microsoft.Xna.Framework.Audio;
namespace WindowsGame1 { class MyAudio { AudioEngine ae; // AudioEngine WaveBank wb; // MyAudio.xap 內的WaveBank SoundBank sb; // MyAudio.xap 內的SoundBank Cue bgm; // 背景音樂 public MyAudio() { //讀入Content中的檔案 ae = new AudioEngine("Content\\MyAudio.xgs"); wb = new WaveBank(ae, "Content\\Wave Bank.xwb"); sb = new SoundBank(ae, "Content\\Sound Bank.xsb"); bgm = sb.GetCue("BGM"); //讀入BGM.wav } ……..
22
7.4 範例二:背景音樂 //MyAudio.cs // functional member
public void PlaySound(string name) //播放音效 { sb.PlayCue(name); } public void PauseBGM() //暫停背景音樂 { if (bgm.IsPlaying) bgm.Pause(); } public void ResumeBGM() { if (bgm.IsPaused) bgm.Resume(); } //背景音樂恢復播放 public void PlayBgm() //播放背景音樂 { if (!bgm.IsPlaying) { bgm = sb.GetCue(bgm.Name); bgm.Play(); } } public bool IsBgmPause() //背景音樂是否暫停 { return bgm.IsPaused; } // 背景音樂更新 public void Update() { if (bgm.IsStopped) PlayBgm(); ae.Update();
23
7.4 範例二:背景音樂 //MyAudio.cs // functional member
public void Update() // 背景音樂更新 { if (bgm.IsStopped) { PlayBgm(); ae.Update(); } }
24
Cue類別重要的定義(Figure in P7-16)
public sealed class Cue : IDisposable { // 是否暫停 public bool IsPaused { get; } // 是否正在播放 public bool IsPlaying { get; } // 是否停止播放 public bool IsStopped { get; } // 是否正在停止播放 public bool IsStopping { get; } // 3D 音效 根據傾聽者和發送器 調整 Cue 的值 public void Apply3D(AudioListener listener, AudioEmitter emitter); // 暫停播放 public void Pause(); // 播放 public void Play(); // 恢復播放 public void Resume(); // 停止播放 public void Stop(AudioStopOptions options); }
25
7.4 範例二:背景音樂 //Game1.cs namespace WindowsGame1
{ public class Game1 : Microsoft.Xna.Framework.Game {…………. MyAudio audio; // 音效類別 public Game1() {…….. audio = new MyAudio(); // 建立audio audio.PlayBgm();// 播放背景音樂 } ……
26
7.4 範例二:背景音樂 //Game1.cs namespace WindowsGame1
{ public class Game1 : Microsoft.Xna.Framework.Game {…………. protected override void Update(GameTime gameTime) {………… if (mySprite1.Collides(mySprite2)) { Vector2 tempVelocity = mySprite1.velocity; mySprite1.velocity = mySprite2.velocity; mySprite2.velocity = tempVelocity; audio.PlaySound(“chimes”);//圖片在碰撞時產生音效 } audio.Update(); //背景音樂 ……..
27
7.4 範例二:背景音樂 //Game1.cs namespace WindowsGame1
{ public class Game1 : Microsoft.Xna.Framework.Game {…………. protected override void Update(GameTime gameTime) {………… //Keyboard輸入 KeyboardState newState; // 宣告一個KeyboardState 結構的變數 newState = Keyboard.GetState(); //得到目前鍵盤每一個按鍵的狀況 if (oldState.IsKeyUp(Keys.Space) && newState.IsKeyDown(Keys.Space)) //判斷Space鍵是否已經被按 { if (audio.IsBgmPause()) audio.ResumeBGM(); else audio.PauseBGM(); } oldState = newState; base.Update(gameTime); } } }
28
簡易的聲音播放 新版的XNA 3.0 因為增加了Zune機台遊戲的開發,而Zune機台並不支援XACT音效專案相關檔案,所以也提供了簡單的音樂音效播放方式。
29
SoundEffect 類別 public sealed class SoundEffect : IDisposable {
// 得到或設定聲音的遠近距離 (會影響doppler的運算) public static float DistanceScale { get; set; } // 得到或設定doppler運算的參數 public static float DopplerScale { get; set; } // 得到聲音的播放時間 public TimeSpan Duration { get; } // 得到或設定聲音的主音量 (會影響全部 SoundEffectInstance 的音量) // 其有效值為 0.0f (靜音) 到 1.0f public static float MasterVolume { get; set; } // 得到或設定聲音的速度 (內定是 每秒 公尺) public static float SpeedOfSound { get; set; } // 產生一個 SoundEffectInstance 物件 並且播放 public SoundEffectInstance Play(); // 同時設定聲音的主音量 有效值為 0.0f (靜音) 到 1.0f public SoundEffectInstance Play(float volume);
30
SoundEffect 類別 // 產生一個 SoundEffectInstance 物件 並且播放
// 同時設定聲音是否重複播放 有效值為 true、false public SoundEffectInstance Play(float volume, float pitch, float pan, bool loop); // 產生一個 SoundEffectInstance 物件 並且播放 3D 聲音 // 同時設定聲音的傾聽者 AudioListener 和 放音者 AudioEmitter // 使用預設的音量和音高 public SoundEffectInstance Play3D(AudioListener listener, AudioEmitter emitter); // 同時設定聲音的音量、音高和是否重複播放 public SoundEffectInstance Play3D(AudioListener listener, AudioEmitter emitter, float volume, float pitch, bool loop); // 同時設定聲音的多組傾聽者 AudioListener 和 放音者 public SoundEffectInstance Play3D(AudioListener[] listeners, AudioEmitter emitter, }
31
使用SoundEffect播放音效 SoundEffect soundEffect; // 一個SoundEffect物件
soundEffect = Content.Load<SoundEffect>("chimes"); soundEffect.Play();
32
使用SoundEffectInstance播放音效
SoundEffect soundEffect; SoundEffectInstance soundEffectInstance2; soundEffect = Content.Load<SoundEffect>("chimes"); soundEffectInstance = soundEffect.Play(); // 得到一個SoundEffectInstance 物件 soundEffectInstance.Stop(); // 播放 soundEffectInstance.Play(); // 停止播放
33
The End
Similar presentations