ページ 11

【解決済】オリジナルセーブデータロードからのBGMについて

Posted: 2025年3月15日(土) 12:45
by ちゃみ
こんにちは。
お世話になっております。

ただいまHimeWorks様の『HIME_PreTitleEvents.js』によって公式タイトル表示前にイベントを用いてオリジナルのタイトル画面を作成しております。
セーブデータを【セーブデータ画面(SceneManager.push(Scene_Load);)】ではなく

スクリプトコマンド:DataManager.loadGame(1)
          SceneManager.goto(Scene_Map);

上記のスクリプトを実行し直接セーブデータファイル1をロードすることが出来ましたが、BGMが再現されません。
正確にはオリジナルタイトル画面で自動実行しているイベントの中でBGMを鳴らしているのですが
そのBGMがロードされたマップでも継続して流れている状態です。
そのマップには『BGM自動演奏』として別のBGMを設定してあるのですがそれが流れません。

そこで2つ質問なのですが

まず1つ目は
上記の方法でセーブデータをロードしたときに
セーブしたマップで流れていたBGMを流すにはどうしたらいいのでしょうか?
作成しているゲームの特質上、いろんなシチュエーションでのセーブポイントの作成を想定しているため、
そのセーブをした場所で流れているBGMを流したいのです。

ちなみにセーブは

スクリプトコマンド:DataManager.saveGame(1)

でセーブの処理を行いました。

このような処理はツクマテのviewtopic.php?t=12974こちらのトピックを参考にさせていただきました。
トピック主様と私とで違う点は私はトリアコンタン様の【ピクチャのボタン化プラグイン】を利用していない点と私の場合はMZであるという点です。
そちらのトピックに返信して教えて頂こうとも考えましたが2年以上経過している為
こちらで新しくトピックを投稿しようと思いました。
スクリプトやプラグインの知識がないため、教えていただけますでしょうか。

そして2つ目は
上記のようなスクリプトコマンドでセーブ・ロードをすることで
「そのやり方だと後々こういったトラブルが起こるよ」とか
「それだけの処理じゃ、~と~が取得できてないよ」等、注意することはありますでしょうか?

よろしくお願い致します。

HimeWorks様:『HIME_PreTitleEvents.js』https://plugin.fungamemake.com/archives/26756
       MV用とありますがMZでも作動しました。

Re: オリジナルセーブデータロードからのBGMについて

Posted: 2025年3月15日(土) 18:19
by 剣崎 宗二
ちゃみ さんが書きました: 上記の方法でセーブデータをロードしたときに
セーブしたマップで流れていたBGMを流すにはどうしたらいいのでしょうか?
作成しているゲームの特質上、いろんなシチュエーションでのセーブポイントの作成を想定しているため、
そのセーブをした場所で流れているBGMを流したいのです。
SceneManager.goto(Scene_Map);
の直前に

コード: 全て選択

$gameSystem.onAfterLoad()
を追加してみてください。

但しこれが動くためには
DataManager.saveGame(1)
の直前に

コード: 全て選択

$gameSystem.onBeforeSave();
が必要です。

ちゃみ さんが書きました: そして2つ目は
上記のようなスクリプトコマンドでセーブ・ロードをすることで
「そのやり方だと後々こういったトラブルが起こるよ」とか
「それだけの処理じゃ、~と~が取得できてないよ」等、注意することはありますでしょうか?
そもそもこの手段はセーブ周りの処理をかなり簡略化しており、色々カットしております。
なので、セーブ周りに手を加えたりするプラグインとは相性悪いです。
そう言ったプラグインを入れないのであれば恐らく問題ないと思いますが…
問題が出た際には順次対処する前提での方法です。
それがダメだというのであれば、使わない方が良いのかなと。

まともにしっかりやるならシーンの構築を考えて、大体20行くらいのプラグインを時間を掛けて書く必要があります。

Re: オリジナルセーブデータロードからのBGMについて

Posted: 2025年3月15日(土) 19:32
by ちゃみ
剣崎 宗二様
返信ありがとうございます。

教えて頂いた通りに設定しテストプレイをしたところ
エラーが発生してしまいました。

こちらがスタックトレースです。

TypeError: Cannot read property 'name' of null
at Function.AudioManager.playBgm (rmmz_managers.js:1169)
at Game_System.onAfterLoad (rmmz_objects.js:361)
at Game_System.onAfterLoad (PluginCommonBase.js:450)
at Game_System.onAfterLoad (DeadMemberToCoffin.js:554)
at Game_System.onAfterLoad (KMS_DebugUtil.js:1095)
at eval (eval at Game_Interpreter.command355 (rmmz_objects.js:11304), <anonymous>:2:13)
at Game_Interpreter.command355 (rmmz_objects.js:11304)
at Game_Interpreter.executeCommand (rmmz_objects.js:9666)
at Game_Interpreter.update (rmmz_objects.js:9571)
at Game_Map.updateInterpreter (rmmz_objects.js:6801)

私にはこのエラーの対処をするのが難しいので
おとなしく用意されているセーブ・ロードを使おうと思います。
また、実現できそうなプラグインを見つけたら挑戦してみようと思います。

剣崎 宗二様
ご親切に教えてくださりましてありがとうございます。

Re: オリジナルセーブデータロードからのBGMについて

Posted: 2025年3月16日(日) 08:04
by 剣崎 宗二
そう言えばロード、非同期でしたね…
onAfterLoadとloadGameの順番を確保する為

コード: 全て選択

DataManager.loadGame(savefileId)
        .then(() => $gameSystem.onAfterLoad())
とする事になるかと思います。
ただ、これだとシーン切り替えの際に別問題が発生する可能性があるので、プラグインを書くしかないかと。
(Scene切り替えとonAfterloadをひとまとめにして、thenの部分で呼び出す)

Re: オリジナルセーブデータロードからのBGMについて

Posted: 2025年3月16日(日) 21:17
by ちゃみ
剣崎 宗二様
返信が遅くなり申し訳ありません。

補足ありがとうございます。
やはり色々と複雑なのですね。

オリジナルセーブ・ロードに関しては
今のところ用意されているものを使おうと思います。

今回の件は
プラグインなしでは複雑な処理をしなくてはならないとわかり
踏ん切りをつけることが出来ました。

助言頂き感謝しております。
ありがとうございました。