はじめに
この記事は、
- Akashic の チュートリアル「音を鳴らす」の要約
- チュートリアル「音を鳴らす」では書かれていない「音を止める」方法
環境
- Akashic Engine v2
- @akashic/akashic-cli 1.7.19
音を鳴らすための準備
音を鳴らすためのコードを書く前に、
- 音源ファイルを用意する
game.json
にファイルの場所を追記する
作業が必要になります。
音源ファイルを用意する
音源ファイルは aac
形式と ogg
形式の2種類用意する必要があります。
mp3 などを aac と ogg に変換する
mp3などの形式だとAkashicでは扱えないため、適当なツールを使って aac 形式と ogg 形式に変換してあげます。
- https://convertio.co/ja/aac-ogg/
- ファイルをアップロードして aac と ogg に変換できます。特にツールをインストールする必要もないので簡単です。
- https://github.com/akashic-games/complete-audio
- Akashic Games 公式のツールですが、 ffmpeg のインストールが必要になったりなど少し面倒です。
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
オブジェクトを返します。
- https://akashic-games.github.io/reference/akashic-engine-v2/classes/lib_main_d.g.audioasset.html#play
- https://akashic-games.github.io/reference/akashic-engine-v2/classes/lib_main_d.g.audioplayer.html
AudioPlayer クラスにも stop() メソッドが用意されているので、play() で返ってきた AudioPlayer に対して stop() を呼んでもBGMを止めることができます。