330 likes | 428 Views
2D / 3D 遊戲程式設計入門 使用 XNA 3.0 與 C#. 第七章 音樂音效. 本章目的. 介紹如何在 XNA 中使用音樂音效 熟悉 XACT 開發工具的入門操作 熟悉 XNA 3.0 簡單的音樂音效播放方式. 7.1 XACT 工具. Cross-Platform Audio Creation Tool 用來產生音效專案相關檔案以供 XNA 專案使用
E N D
2D / 3D 遊戲程式設計入門 使用 XNA 3.0 與 C# 第七章 音樂音效
本章目的 • 介紹如何在XNA中使用音樂音效 • 熟悉XACT開發工具的入門操作 • 熟悉XNA 3.0簡單的音樂音效播放方式
7.1 XACT工具 • Cross-Platform Audio Creation Tool • 用來產生音效專案相關檔案以供XNA專案使用 • 『開始』『所有程式』『Microsoft XNA Game Studio 3.0』『Tools』『Microsoft Cross-Platform Audio Creation Tool (XACT)』
新增一個Wave 檔案倉庫 Wave 檔案倉庫 (Wave Bank) 可以用來儲存多個音樂音效會使用到的Wave 檔案
聲音倉庫 (Sound Bank) • 聲音倉庫 (Sound Bank) 可以用來儲存多組聲音實體
新增聲音實體 • 要新增聲音實體只要把在Wave Bank中的Wave檔案拖曳入Sound Bank視窗的左下角子「Cue Name」區塊下
建立音效音樂相關檔案 • 在Win目錄下會產生三個檔案 • .xgs (XNA global setting 通用設定檔) • .xsb (XNA sound bank 檔) • .xwb (XNA wave bank 檔)。
7.3 範例一:實作一個音效類別 『專案』『加入類別』 選擇『類別』,並將此類別名稱設為MyAudio.cs
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);}} }
7.3 範例一:實作一個音效類別 //Game1.cs namespace WindowsGame1 { public class Game1 : Microsoft.Xna.Framework.Game { ………. MyAudio audio; // 音效類別 public Game1() { ….. audio = new MyAudio(); // 建立audio } …………………..
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); }
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} ……..
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(); } } } }
7.4 範例二:背景音樂 //MyAudio.cs // functional member public void Update() // 背景音樂更新 { if (bgm.IsStopped) { PlayBgm(); ae.Update();} } } }
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); }
7.4 範例二:背景音樂 //Game1.cs namespace WindowsGame1 { public class Game1 : Microsoft.Xna.Framework.Game {…………. MyAudio audio; // 音效類別 public Game1() {…….. audio = new MyAudio(); // 建立audio audio.PlayBgm();// 播放背景音樂} ……
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(); //背景音樂 ……..
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);} } }
簡易的聲音播放 • 新版的XNA 3.0 因為增加了Zune機台遊戲的開發,而Zune機台並不支援XACT音效專案相關檔案,所以也提供了簡單的音樂音效播放方式。
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; } // 得到或設定聲音的速度 (內定是 每秒 343.5 公尺) public static float SpeedOfSound { get; set; } // 產生一個 SoundEffectInstance 物件 並且播放 public SoundEffectInstance Play(); // 產生一個 SoundEffectInstance 物件 並且播放 // 同時設定聲音的主音量 有效值為 0.0f (靜音) 到 1.0f public SoundEffectInstance Play(float volume);
SoundEffect 類別 // 產生一個 SoundEffectInstance 物件 並且播放 // 同時設定聲音的主音量 有效值為 0.0f (靜音) 到 1.0f // 同時設定音高調整 有效值為 -1.0f 到 1.0f // 同時設定左右聲道調整 有效值為 -1.0f(左) 到 1.0f(右) // 同時設定聲音是否重複播放 有效值為 true、false public SoundEffectInstance Play(float volume, float pitch, float pan, bool loop); // 產生一個 SoundEffectInstance 物件 並且播放 3D 聲音 // 同時設定聲音的傾聽者 AudioListener 和 放音者 AudioEmitter // 使用預設的音量和音高 public SoundEffectInstance Play3D(AudioListener listener, AudioEmitter emitter); // 產生一個 SoundEffectInstance 物件 並且播放 3D 聲音 // 同時設定聲音的傾聽者 AudioListener 和 放音者 AudioEmitter // 同時設定聲音的音量、音高和是否重複播放 public SoundEffectInstance Play3D(AudioListener listener, AudioEmitter emitter, float volume, float pitch, bool loop); // 產生一個 SoundEffectInstance 物件 並且播放 3D 聲音 // 同時設定聲音的多組傾聽者 AudioListener 和 放音者 // 同時設定聲音的音量、音高和是否重複播放 public SoundEffectInstance Play3D(AudioListener[] listeners, AudioEmitter emitter, float volume, float pitch, bool loop); }
使用SoundEffect播放音效 SoundEffect soundEffect; // 一個SoundEffect物件 soundEffect = Content.Load<SoundEffect>("chimes"); soundEffect.Play();
使用SoundEffectInstance播放音效 SoundEffect soundEffect; SoundEffectInstance soundEffectInstance2; soundEffect = Content.Load<SoundEffect>("chimes"); soundEffectInstance = soundEffect.Play(); // 得到一個SoundEffectInstance 物件 soundEffectInstance.Stop(); // 播放 soundEffectInstance.Play(); // 停止播放