摘要:XNA 3.0 MediaPlayer做個簡單的音樂MP3播放器!
之前有跟大家介紹過XNA3.0的一些新功能
像是新增的SoundEffect的API,以及將遊戲Depoly到ZUNE上面等。
今天要跟大家說的是MediaPlayer這個API
之前有跟大家介紹過XNA3.0的一些新功能
像是新增的SoundEffect的API,以及將遊戲Depoly到ZUNE上面等。
今天要跟大家說的是MediaPlayer這個API
首先做法都是依樣,我可以將我的MP3音樂增加到Content的虛擬目錄中,如下圖
上面在Content的虛擬目錄夾當中,我加入了一首test_music的mp3歌曲。
在這邊跟soundeffect不同的地方是,在屬性的地方,這邊使用的processor是Song processor。
在程式碼的部份我們需要加入Song這個物件,等等用來儲存Content處理過後分析得到的音樂資訊。
EX: Song music;
在LoadContent的部分打入以下指令,就可以完成簡單的音樂播放。
music = Content.Load<Song>("test_music");
MediaPlayer.Play(music);
編譯過後就可以聽到歌曲。
PS1 : 如果你在編譯過後沒有聽到音樂,請先檢查是否有將喇叭打開或是調成靜音,如果都確認過後還是沒有聲音,請從新執行。
PS2 : 如果你在Windows Game的專案無法直接使用MediaPlayer的類別,請先新增一個XBOX360 or Zune的遊戲專案,之後再將專案轉換成Windows專案即可(部分使用者可能會發生無法在Windows Game使用MediaPlayer類別,請依照上述方法去做)。
接下來有一些可以提的就是,SoundEffect跟MediaPlayer的使用時機。
自從3.0一出以後,我後來發現這樣XACT好像變的有點無用武之地...
XACT提供很好的音效處理的部分,可是對於一般的遊戲而言,可能使用XACT的部分就是播放背景音樂或是一些簡單的音效。
很少用XACT使用像是增加音效的播放平率那些控制等。
同時XACT又有很大的缺點就是匯入的音樂一定要是WAV檔案...
同時,壓縮方式又是PCM,幾乎是無損的壓縮方式,這樣音樂容量跟原本是差不多的。
雖然XACT3.0有提供比較好的壓縮方式,就是提供WMA壓縮,可是XNA3.0的部分,XACT仍然是2.0的版本。
這次新增這兩個強而有力的API我想使用XACT的使用者或許會變少吧@@"
使用SoundEffect的時機,就是在播放音效的部分...
有用過這個API的使用者應該知道,這個類別提供兩個主要的方法Play和Dispose。
Play的部份就是播放,但是沒有暫停的功能,雖然Play有三個Overloading可是仔細觀察的話可以看到都是運用在音效上面比較實際。
相較於MediaPlayer的部分,他提供Play、Stop、Resume、Pause這些功能,結合MediaState就可以製作出簡單的播放器了。
所以... XACT = SoundEffect + MediaPlayer
這是給我的感覺XD
PS 本次Song Processor所編意出來的檔案是wma檔並非原本的XNB,壓縮率為192KBPS。
以下是完整的程式碼的部分,這邊不提供歌曲,有興趣的使用者可以隨便找WAV、MP3、WMA的音樂格式來玩看看。
02 using System.Collections.Generic;
03 using System.Linq;
04 using Microsoft.Xna.Framework;
05 using Microsoft.Xna.Framework.Audio;
06 using Microsoft.Xna.Framework.Content;
07 using Microsoft.Xna.Framework.GamerServices;
08 using Microsoft.Xna.Framework.Graphics;
09 using Microsoft.Xna.Framework.Input;
10 using Microsoft.Xna.Framework.Media;
11 using Microsoft.Xna.Framework.Net;
12 using Microsoft.Xna.Framework.Storage;
13
14 namespace WindowsGame3
15 {
16 public class Game1 : Microsoft.Xna.Framework.Game
17 {
18 GraphicsDeviceManager graphics;
19 SpriteBatch spriteBatch;
20
21 Song music;
22
23 KeyboardState old, current;
24
25 public Game1()
26 {
27 graphics = new GraphicsDeviceManager(this);
28 Content.RootDirectory = "Content";
29 }
30 protected override void Initialize()
31 {
32 old = current = Keyboard.GetState();
33
34 base.Initialize();
35 }
36 protected override void LoadContent()
37 {
38 spriteBatch = new SpriteBatch(GraphicsDevice);
39
40 music = Content.Load<Song>("test_music");
41 MediaPlayer.Play(music);
42 }
43 protected override void UnloadContent()
44 {
45 }
46 protected override void Update(GameTime gameTime)
47 {
48 if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
49 this.Exit();
50
51 old = current;
52 current = Keyboard.GetState();
53
54 if (current.IsKeyDown(Keys.P)&&old.IsKeyUp(Keys.P))
55 {
56 if (MediaPlayer.State == MediaState.Playing)
57 MediaPlayer.Pause();
58 else if (MediaPlayer.State == MediaState.Paused)
59 MediaPlayer.Resume();
60 else
61 MediaPlayer.Play(music);
62 }
63
64 if (current.IsKeyDown(Keys.S)&&old.IsKeyUp(Keys.S))
65 {
66 if (MediaPlayer.State == MediaState.Playing)
67 {
68 MediaPlayer.Stop();
69 }
70 }
71
72 base.Update(gameTime);
73 }
74 protected override void Draw(GameTime gameTime)
75 {
76 GraphicsDevice.Clear(Color.CornflowerBlue);
77
78 base.Draw(gameTime);
79 }
80 }
81 }