之前有跟大家介紹過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);
        }
    }
}

    全站熱搜

    teexit1224 發表在 痞客邦 留言(8) 人氣()