播放声音

更新页 :
页面创建日期 :

总结

导入并播放在 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);
        }
    }
}