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型態的音樂變數。
之後到LoadContent函數將放在Content資料夾的音樂檔讀入,當然此種作法的話就必須將音樂檔案匯入到專案的Content裡面。
使用它的成員函數play就可以將聲音播放出來。
裡面有四個參數可以輸入。
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