XNA-另一種播放聲音的方法

XNA-另一種播放聲音的方法

    這個方法是XNA3.0新增的新功能,主要是不需要使用到之前所教的XACT這個製作音樂專案的軟體,能夠使用XNA3.0新增的SoundEffect資料型態,就可以不必使用到XACT的聲音專案檔,SoundEffect所支援的聲音格式有WAV、 WMA、 和 MP3,其中最大的改善就是能夠讀取mp3音樂格式的檔案。

    需要注意的是SoundEffect和XACT的差異在哪裡,主要的差別就在於XACT專案檔不支援Zune這個平台,因此XNA3.0就多設計了SoundEffect來供我們讀取音樂與播放音樂,所以SoundEffect是支援所有的平台。

  SoundEffect XACT
Windows 支援 支援
Xbox360 支援 支援
Zune 支援 不支援

    首先必須先宣告出一個變數來存放SoundEffect型態的音樂變數。

SoundEffect 變數名稱;

    之後到LoadContent函數將放在Content資料夾的音樂檔讀入,當然此種作法的話就必須將音樂檔案匯入到專案的Content裡面。

變數名稱 = Content.Load<SoundEffect>("檔案路徑");

    使用它的成員函數play就可以將聲音播放出來。

變數名稱.play();

    裡面有四個參數可以輸入。

play(float volume,float pitch,float pan,bool loop)

    volume是音量,它所輸入的數值範圍是0.0到1.0之間的浮點數型態的數值,1.0表示最高的音量。

    pitch是音高,依據音高的特性,故他所輸入的數值範圍是-1.0到1.0之間的浮點數型態的數值,0.0則代表普通音高。

    pan是聲道,輸入的數值範圍是-1.0到1.0之間的浮點數型態的數值,-1.0是代表左聲道,1.0則是代表著右聲道,0.0則代表中間。

    loop是循環,輸入的是布林值,1代表true,也就是聲音播放完之後會自動再播放一次,而0代表false,即代表著聲音播放完之後就不會再播放了,因此這邊就需注意到音效與背景音樂設定不同。

程式範例:


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 soundplay
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        SoundEffect sound;        //先宣告SoundEffect型態的聲音變數
        KeyboardState oldstate;   //為了不讓使用者一值按著某鍵所需的按鍵控制

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            sound = Content.Load<SoundEffect>("raygun");   //將音樂檔讀入進來
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            KeyboardState key = Keyboard.GetState();
            //鍵盤按鍵控制
            if (key.IsKeyDown(Keys.P))
            {
                if (!oldstate.IsKeyDown(Keys.P))
                {
                    sound.Play(1.0f, 0.0f, -1.0f, false);    //播放聲音
                }
            }
            oldstate = key;
            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            base.Draw(gameTime);
        }
    }
}

    此範例是透過鍵盤按鍵P做播放音效的動作,根據所輸入的參數值(1.0f,0.0f,-1.0f,false),代表著音量最大、音高普通、左聲道、不循環的意思,還有做按鍵的控制。

最後附上專案檔soundplay.rar