ティラノスクリプト:BGMや効果音の管理に連想配列をつかう

ゲームには欠かせない要素であるBGMや効果音ですが
使用する数が増えてくると管理が大変になってきます。

とくに複数の素材サイトさんからお借りする場合
サイトによってファイル名の長さに大きな差があったり
ファイル名からどのような音楽か判別がむずかしかったり
使用するときに少し手間がかかってしまうことがあります。

ファイルをリネームしてしまえば問題は解決するのですが
これはこれで「ファイルをひとつずつリネームする手間」と
「どのサイトからどの曲を借りたかを管理する手間」が増えます。

そこで、使用するBGMや効果音をリスト化して
使い勝手を良くしようというのが今回のお題です。
リストには連想配列を使用します。



連想配列とは


配列の仲間ですが添字(インデックス)にキーを指定できるのが特徴です。
たとえば f.bgmList という連想配列を作ったとします。

普通の配列の場合は

f.bgmList[0] = "music001.ogg";
f.bgmList[1] = "happy.ogg";

もしくは
f.bgmList = ["music001.ogg", "happy.ogg"];

と書きますが、連想配列は
f.bgmList["normal"] = "music001.ogg";
f.bgmList["happy"] = "happy.ogg";

もしくは
f.bgmList = {
"normal": "music001.ogg",
"happy": "happy.ogg"
};

と書きます。この"normal"や"happy"を《キー》と呼びます。
キーにアクセスするには以下のように書きます。
var value = f.bgmList["normal"];
var value = f.bgmList.normal;

console.log(value);
// コンソールには「music001.ogg」と表示される

もっと詳しく知りたい人は「JavaScript 連想配列」でググってね。
それでは、これを使って実際にBGMリストを作ってみましょう。



BGMのリストを作る


たとえば下記のようなBGMの設定を考えたとします。
左側がBGMを使うシーン、右側が再生するファイル名です。

通常時 :music001.ogg
楽しい時:candymusic.ogg
悲しい時:bgmfile_003.ogg
イベント:event_loop_110.ogg
ED曲 :fantasy_theme.ogg

これを連想配列にしていきます。

f.bgmList = {
"normal": "music001.ogg",
"happy": "happy.ogg",
"sad": "bgmfile_003.ogg",
"event": "event_loop_110.ogg",
"ending": "ending_theme.ogg"
};

ついでに効果音リストも作っておきます。
書きかたはBGMリストと同じです。
f.seList = {
"enter":"button001.ogg",
"click":"effect_paternA_005.ogg",
"effect":"sound111.ogg"
};

おまけで効果音用のバッファ指定もリスト化。
f.bufList = {
"enter":"0",
"click":"1",
"effect":"2"
};

キーの名前をややこしくすると本末転倒になってしまうので
ひと目で用途が分かるような名前にしておきましょう。



ティラノスクリプトで使ってみる


BGMを再生するときは以下のように記述します。

[ playbgm storage="&f.bgmList.normal" ]

これを実行すると連想配列 f.bgmList のキー《normal》に格納されている「music001.ogg」が再生されます。

効果音を再生するときも同じように書きます。
[ button graphic="img.png" enterse="&f.seList.enter" clickse="&f.seList.click" ]

ホバー時に button001.ogg が再生され、クリック時に effect_paternA_005.ogg が再生されます。

もちろんマクロにしても問題ありません。
[ macro name="通常BGM再生" ]
[ playbgm storage="&f.bgmList.normal" ]
[ endmacro ]


; バッファ番号2で「sound111.ogg」を再生
[ macro name="エフェクト再生" ]
[ playse storage="&f.seList.effect" loop="false" buf="&f.bufList.effect" ]
[ endmacro ]


関連記事

Comments 3

There are no comments yet.
おにぎり  
Re: システム変数(sf.xxx)の利用

いえいえ、こんなにも早くご本人様に回答いただけるとは思いませんで、大変うれしく思います。
(コメントが承認制なのを存じ上げず、すみません……)
むしろ押しつけがましい文章になってしまいまして、申し訳ないです。

当方、パッチの作成はしたことがないもので、想像の範疇でコメントを残してしまいお恥ずかしい限りです。
仰るような回避方法があると初めて知り、返答いただけて本当に良かったと感じております。

返信のお手間を頂戴してしまい、すみません。
重ね重ね、迅速なご返答ありがとうございます。

2020/06/25 (Thu) 06:13 | EDIT | REPLY |   
こ・ぱんだ  
Re: システム変数(sf.xxx)の利用

こんにちは、こ・ぱんだです。
コメントありがとうございます。

サンプルとして記載しているスクリプトはあくまでも一例であると捉えていただけると助かります。
エントリ内に「ゲーム変数を使用しろ」とは書いてはいませんし、反対にシステム変数を使えと押しつけるつもりもありません。

修正パッチを充てる場合はシステム変数のほうが確かにラクなのですが、
ゲーム変数でもパッチ内で条件式をかませてやれば出来てしまうため、
どちらが正しくてどちらが間違っているのか私には判断がむずかしいです。
ですので、おにぎり様が使いやすいほうを選ぶのがベストだと思います。

丁寧なコメントをいただいたにもかかわらず、回答らしい回答ができず申し訳ありません。
何卒ご容赦いただけますと幸いです(_ _)

2020/06/24 (Wed) 18:17 | EDIT | REPLY |   
おにぎり  
システム変数(sf.xxx)の利用

初めまして。こちらのサイト様にはハイクオリティな素材だけでなく、分かりやすい技術解説でも毎度助けられております。
記事の内容に関し、些末なことながら気になった点がありまして、これから利用されるどなたかの目に触れていただければと思い、書き込ませて頂きます。

気になった点というのはゲーム変数(f.xxx)を利用している点で、特殊な場合以外はシステム変数(sf.xxx)のほうが有用ではと思いつきまして……。

ゲーム変数(f.xxx)はセーブデータ内に残留するので、アップデートでファイル差し替えとなった際(例えば素材サイトの利用規約変更で使用不可になった場合など)に、古いファイル名を読みに行ってしまい動作停止に陥る可能性があるのではないでしょうか。
(雷直撃並みのレアケースかもしれませんが……)

セーブ時点で既に流れているBGMはどうしても読み込み失敗が起こりますが、実際に確認してみたところ動作不能にはならないはずです。
しかし、「これから読み込む」ファイルに関しては記述に到達すると動作が停止してしまいます。
(TyranoScript v503f で取り急ぎ確認)

ですので実装する場合は、セーブデータを生き永らえさせるにあたってシステム変数が有用ではないかと考えた次第です。

範囲の狭い話で既存構文変更の労力には見合わないと思われますし、2年半も経過して重箱の隅をつつくような内容で恐縮ですが、思い切ってコメントを残させて頂きました。
いつもありがとうございます。

2020/06/24 (Wed) 06:49 | EDIT | REPLY |   

Leave a reply