Webエンジニアの日常とリーグオブレジェンド

Webエンジニアとして働いている猫のブログ。EmacsとMySQLとリーグオブレジェンド(LoL)が好物。主に技術的な記事かLoLの記事を書く。

Akasic game engine で BGM の再生と停止を行う

Akashic Engine のロゴ
Akashic Engine のロゴ

はじめに

この記事は、

  • Akashic の チュートリアル「音を鳴らす」の要約
  • チュートリアル「音を鳴らす」では書かれていない「音を止める」方法

akashic-games.github.io

環境

  • Akashic Engine v2
  • @akashic/akashic-cli 1.7.19

音を鳴らすための準備

音を鳴らすためのコードを書く前に、

  • 音源ファイルを用意する
  • game.json にファイルの場所を追記する

作業が必要になります。

音源ファイルを用意する

音源ファイルは aac 形式と ogg 形式の2種類用意する必要があります。

mp3 などを aac と ogg に変換する

mp3などの形式だとAkashicでは扱えないため、適当なツールを使って aac 形式と ogg 形式に変換してあげます。

game.json の更新

aac と ogg のファイルを配置する

aac 形式のファイルと ogg 形式のファイルを同じファイル名で audio ディレクトリ以下に配置した後、 akashic scan asset コマンドを叩くと、(正しくファイルが置かれていれば) game.json に音源ファイルが追加されます。

例えば、以下の2ファイルを用意したとします。

  • audio/bgm.aac
  • audio/bgm.ogg

この状態で akashic scan asset コマンドを実行すると、 games.json に以下のように追加されます。

{
    ...
    "assets": {
        ...
        "bgm": {
            "type": "audio",
            "path": "audio/bgm",
            "systemId": "sound",
            "duration": 103747
        }
    },
    ...
}

systemId について

先程の game.json を見てみると、 systemId というものがあります。デフォルトだと "systemId": "sound" になっています。

  • "systemId": "sound" は「効果音」であることを表す
  • これを "systemId": "music" に変更すると「BGM」になる

「効果音」は1回しか再生されないが、「BGM」は無限ループで再生されます。

BGM の再生・停止

では、以下のように games.json に登録されたとして、

{
    ...
    "assets": {
        ...
        "bgm": {
            "type": "audio",
            "path": "audio/bgm",
            "systemId": "sound",
            "duration": 103747
        }
    },
    ...
}

これの再生・停止を行ってみます。コードは以下の通りです。

const bgmAssetId = 'bgm'
const scene = new g.Scene({
  game: g.game,
  assetIds: [bgmAssetId], // BGMをassetとして準備
})

var player
scene.loaded.add(() => {
  // BGM を再生
  player = scene.assets[bgmAssetId].play()
})
// pushScene のタイミングで loaded が呼ばれて BGM が再生される
g.game.pushScene(scene)

// 10秒したらBGMを止める
scene.setTimeout(() => {
  player.stop()
  // scene.assets[bgmAssetId].stop() でも止めることができる
}, 10000)

上記コードの詳細

scene.assets[bgmAssetId] で、 AudioAsset オブジェクトが返ってきます。

AudioAsset のリファレンスは以下です。

AudioAsset は play()stop() のメソッドを持つので、これで再生の開始・再生の停止ができます。

また、 play() メソッドは AudioPlayer オブジェクトを返します。

AudioPlayer クラスにも stop() メソッドが用意されているので、play() で返ってきた AudioPlayer に対して stop() を呼んでもBGMを止めることができます。