6. 音を出す

この文書では、効果音(サウンドエフェクト)およびBGMを再生する手順について説明します。

音を鳴らす手順

では、プログラム開始時にBGMをループ再生し、ボタンを押したときに効果音を鳴らすようにしてみましょう。

ファイルをプロジェクトに登録する

まず、再生したい効果音ファイルとBGMファイルをプロジェクトに登録します。

sample/Tutorial/Sample06_01/Sample06_01.slnを開いてください。

  1. PSM Studioのソリューションエクスプローラで、soundフォルダーを選択し、右クリック - [追加] - [ファイル]を追加 で再生したいファイルを選択します。
image/program_guide/sound.PNG
  1. ファイルを登録したら、ファイルを右クリックし、[Build Action] - [Content] を選択しておきます。
  • 現在、効果音のファイル形式はWAV形式のみ対応しています。
  • 現在、BGMのファイル形式はmp3形式のみ対応しています。
  • ファイルを登録するフォルダーはsoundでなく、任意の場所でも構いません。

サウンドの初期化

効果音

効果音の再生にはSoundクラスとSoundPlayerクラスを使用します。

Sound soundBullet;
public SoundPlayer soundPlayerBullet;
...
soundBullet = new Sound("/Application/sound/Bullet.wav");
soundPlayerBullet = soundBullet.CreatePlayer();

Soundクラスは効果音のデータを表すクラスです。

SoundPlayer クラスは、効果音の再生用のクラスです。

1つのSoundクラスに対して、複数のSoundPlayerを使用することにより、1種類の効果音を複数同時に再生することができます。

BGM

BGMの再生には、BgmクラスとBgmPlayerクラスを使用します。

Bgm bgm;
public BgmPlayer bgmPlayer;
...
//@j BGMの初期化。
bgm = new Bgm("/Application/sound/GameBgm.mp3");
bgmPlayer = bgm.CreatePlayer();
bgmPlayer.Loop = true;

Bgm クラスはBGMのデータを表すクラスです。

BgmPlayer クラスは、BGMの再生を行うためのクラスです。

Bgm は同時に1つだけしか再生することができません。そのため BgmPlayer を複数作成することはできません。

ここではBGMが終了したときループ再生するように、bgmPlayer.Loopにtrueを設定しています。

サウンドの再生

効果音を鳴らすには、SoundPlayerのPlay()を呼び出します。 以下の例では○ボタンまたは×ボタンを押したときに発射音が鳴ります。

sample/Tutorial/Sample06_01/Player.cs

if((gs.PadData.ButtonsDown & (GamePadButtons.Circle | GamePadButtons.Cross)) != 0)
{
    gs.soundPlayerBullet.Play();
    ...
}

BGMを再生するにはBgmPlayer.Play() を呼び出します。

sample/Tutorial/Sample06_01/GameFrameworkSample.cs

bgmPlayer.Play();

弾の発射

ついでにボタンを押したとき、弾を発射できるようにしておきましょう。

星と同じ要領で弾のクラスを作ります。

sample/Tutorial/Sample06_01/Bullet.cs

public class Bullet : GameActor
{
    static int idNum=0;
    float speed=6;

    Vector2 trans;

    public Bullet(GameFrameworkSample gs, string name,  Texture2D textrue, Vector3 position, float speed, float direction) : base (gs, name)
    {
        Name = name + idNum.ToString();
        this.sprite = new SimpleSprite( gs.Graphics, textrue);
        this.sprite.Position = position;
        this.sprite.Center.X = 0.5f;
        this.sprite.Center.Y = 0.5f;

        this.speed = speed;

        this.trans.X= FMath.Cos((direction-90.0f)/180*FMath.PI);
        this.trans.Y= FMath.Sin((direction-90.0f)/180*FMath.PI);

        idNum++;
    }

    public override void Update()
    {
        sprite.Position.X = sprite.Position.X+trans.X * speed;
        sprite.Position.Y = sprite.Position.Y+trans.Y * speed;

        if (sprite.Position.X < 0 || gs.rectScreen.Width < sprite.Position.X ||
            sprite.Position.Y < 0  || gs.rectScreen.Height < sprite.Position.Y)
        {
            this.Status = Actor.ActorStatus.Dead;
        }

        base.Update();

    }

}

Playerクラス内のUpdate()で、ボタンを押したときにBulletクラスのインスタンスを生成し、アクターのツリーに登録するようにします。

sample/Tutorial/Sample06_01/Player.cs

if((gs.PadData.ButtonsDown & (GamePadButtons.Circle | GamePadButtons.Cross)) != 0)
{
    gs.soundPlayerBullet.Play();
    gs.Root.Search("bulletManager").AddChild(new Bullet(gs, "bullet", gs.textureBullet,
        new Vector3(this.Sprite.Position.X, this.Sprite.Position.Y, 0.4f), 6.0f, 0.0f));
}

実行してみると、ゲーム開始時にBGMが再生されます。 また、ボタンを押したときに効果音が再生され、弾が発射されるようになっています。

image/program_guide/fire_bullet.PNG