之前有跟大家介紹過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的音樂格式來玩看看。
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
namespace WindowsGame3
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Song music;
KeyboardState old, current;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
old = current = Keyboard.GetState();
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
music = Content.Load<Song>("test_music");
MediaPlayer.Play(music);
}
protected override void UnloadContent()
{
}
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
old = current;
current = Keyboard.GetState();
if (current.IsKeyDown(Keys.P)&&old.IsKeyUp(Keys.P))
{
if (MediaPlayer.State == MediaState.Playing)
MediaPlayer.Pause();
else if (MediaPlayer.State == MediaState.Paused)
MediaPlayer.Resume();
else
MediaPlayer.Play(music);
}
if (current.IsKeyDown(Keys.S)&&old.IsKeyUp(Keys.S))
{
if (MediaPlayer.State == MediaState.Playing)
{
MediaPlayer.Stop();
}
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
base.Draw(gameTime);
}
}
}
留言列表