播放聲音

更新頁 :
頁面創建日期 :

總結

匯入並播放在 XACT 中創建的聲音檔。

經營環境

先決條件

支援的 XNA 版本
  • 2.0
  • 3.0
支援的平臺
  • Windows(XP SP2 或更高版本、Vista)
  • Xbox 360 的
Windows 所需的頂點著色器版本 1.1
Windows 所需的像素著色器版本 1.1

經營環境

平臺

如何使用樣本

工作鍵盤Xbox 360 控制器滑鼠
播放聲音 一個 一個 -

物質

注: 這些提示基於 XNA Game Studio 2.0。

為了播放聲音,您需要將在「創建用於播放 XNA 的聲音的檔」中創建的檔註冊到專案中。


サウンドファイルの登録

右鍵按下 Content 資料夾,然後選擇 Add - Existing Item。


xap ファイルを選択

這。 選擇要載入的 「xap」 檔案。 (示例中的 “Audio.xap”)


追加された xap ファイル

xap 檔將添加到 Content 資料夾中。


Wave ファイルを Content フォルダに追加

接下來,將用於創建 xap 檔的 wave 檔直接移動到 Content 資料夾。 要記住的一點是,WAV 檔必須放置在與創建 XAP 檔時相同的相對路徑中。

在本例中,我將 wave 檔直接移動到資料夾中,但將其添加到我的項目中沒有任何問題。


就是這樣,你準備好了。 從這裡開始,它將是一個程式。

/// <summary>
/// オーディオエンジン
/// </summary>
private AudioEngine audioEngine = null;

/// <summary>
/// WaveBank
/// </summary>
private WaveBank waveBank = null;

/// <summary>
/// SoundBank
/// </summary>
private SoundBank soundBank = null;

要播放聲音,請使用三個選項:“AudioEngine”、“WaveBank”和“SoundBank”。 您很可能會使用 SoundBank 或 AudioEngine,但您需要創建所有三個實例。

創建實例

/// <summary>
/// ゲームが始まる前の初期化処理を行うメソッド
/// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
/// </summary>
protected override void Initialize()
{
    // オーディオデータの読み込み
    this.audioEngine = new AudioEngine(@"Content\Audio.xgs");
    this.waveBank = new WaveBank(this.audioEngine, @"Content\Wave Bank.xwb");
    this.soundBank = new SoundBank(this.audioEngine, @"Content\Sound Bank.xsb");

    // コンポーネントの初期化などを行います
    base.Initialize();
}

與聲音相關的實例是在 Game.Initialize 方法中創建的。 建立每個類別時,將參數設定為 . XGS」「。 xwb」「. .xsb“檔,這些檔是在生成專案時基於 XAP 專案文件自動創建的。

audio、soundbank 和 wavebank 檔案的名稱必須與在 XACT 中創建工程時設置的名稱相同。 此外,由於文件的路徑是相對於可執行檔的,因此在此示例中必須包含“Content”資料夾的路徑。

AudioEngine **構造 函數

創建用於處理音頻物件的 AudioEngine 類的實例。

settings檔 字串 要載入的設定檔的路徑

WaveBank 構造 函數

創建包含 wave 檔集合的 WaveBank 類的實例。

audioEngine (音訊引擎) 音訊引擎 WaveBank 和 AudioEngine
nonStreamingWaveBank文件名 字串 要載入的 WaveBank 檔案的路徑

SoundBank 構造 函數

創建包含佇列集合的 SoundBank 類實例。

audioEngine (音訊引擎) 音訊引擎 用於連接到 SoundBank 的 AudioEngine
檔名 字串 要載入的 SoundBank 檔案的路徑

播放聲音

if (keyState.IsKeyDown(Keys.A) || padState.Buttons.A == ButtonState.Pressed)
{
    if (this.pressed == false)
    {
        // サウンドを再生
        this.soundBank.PlayCue("Sample");

        this.pressed = true;
    }
}
else
{
    this.pressed = false;
}

要播放聲音,請使用 SoundBank.PlayCue 方法。 要播放的聲源由 XACT 中設置的 「Cue」 的名稱指定。

播放后,聲音將繼續流動直到結束。 此外,同一聲源可以通過多次播放來一遍又一遍地播放。

在該示例中,按下每個 A 按鈕或 A 鍵即可播放一次。

SoundBank.PlayCue 方法

播放提示。

名字 字串 要播放的佇列的名稱

所有代碼

using System;
using System.Collections.Generic;
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.Net;
using Microsoft.Xna.Framework.Storage;

namespace PlaySound
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// グラフィックデバイス管理クラス
        /// </summary>
        private GraphicsDeviceManager graphics = null;

        /// <summary>
        /// スプライトのバッチ化クラス
        /// </summary>
        private SpriteBatch spriteBatch = null;

        /// <summary>
        /// オーディオエンジン
        /// </summary>
        private AudioEngine audioEngine = null;

        /// <summary>
        /// WaveBank
        /// </summary>
        private WaveBank waveBank = null;

        /// <summary>
        /// SoundBank
        /// </summary>
        private SoundBank soundBank = null;

        /// <summary>
        /// キープレスフラグ
        /// </summary>
        private bool pressed = false;


        /// <summary>
        /// GameMain コンストラクタ
        /// </summary>
        public GameMain()
        {
            // グラフィックデバイス管理クラスの作成
            this.graphics = new GraphicsDeviceManager(this);

            // ゲームコンテンツのルートディレクトリを設定
            this.Content.RootDirectory = "Content";
        }

        /// <summary>
        /// ゲームが始まる前の初期化処理を行うメソッド
        /// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
        /// </summary>
        protected override void Initialize()
        {
            // オーディオデータの読み込み
            this.audioEngine = new AudioEngine(@"Content\Audio.xgs");
            this.waveBank = new WaveBank(this.audioEngine, @"Content\Wave Bank.xwb");
            this.soundBank = new SoundBank(this.audioEngine, @"Content\Sound Bank.xsb");

            // コンポーネントの初期化などを行います
            base.Initialize();
        }

        /// <summary>
        /// ゲームが始まるときに一回だけ呼ばれ
        /// すべてのゲームコンテンツを読み込みます
        /// </summary>
        protected override void LoadContent()
        {
            // テクスチャーを描画するためのスプライトバッチクラスを作成します
            this.spriteBatch = new SpriteBatch(this.GraphicsDevice);

            // TODO: this.Content を使用してゲームコンテンツを読み込む
            //       ロジックを書いてください
        }

        /// <summary>
        /// ゲームが終了するときに一回だけ呼ばれ
        /// すべてのゲームコンテンツをアンロードします
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: ContentManager で管理されていないコンテンツを
            //       ここでアンロードしてください
        }

        /// <summary>
        /// 描画以外のデータ更新等の処理を行うメソッド
        /// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Update(GameTime gameTime)
        {
            // キーボードの情報取得
            KeyboardState keyState = Keyboard.GetState();

            // ゲームパッドの情報取得
            GamePadState padState = GamePad.GetState(PlayerIndex.One);

            // Xbox360 コントローラの BACK ボタンを押したときにゲームを終了させます
            if (padState.Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }

            if (keyState.IsKeyDown(Keys.A) || padState.Buttons.A == ButtonState.Pressed)
            {
                if (this.pressed == false)
                {
                    // サウンドを再生
                    this.soundBank.PlayCue("Sample");

                    this.pressed = true;
                }
            }
            else
            {
                this.pressed = false;
            }

            // 登録された GameComponent を更新する
            base.Update(gameTime);
        }

        /// <summary>
        /// 描画処理を行うメソッド
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            this.GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: ここに描画処理を記述します

            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
    }
}