【質問】セーブ時のエラーの対処

たまな

ユーザー
ゲームを作っていくとき
細かい単位で確認した時のイベント(1イベント)ではちゃんと動いてたのに
少しまとまった単位で仕上がったのでその単位を通しでしようとゲームする時(1ミッション)
途中でセーブを入れるとエラーになることが度々あります
(セーブをいれないと普通に動いてたりします)

これもっと大きい単位になると(1章節とか1ブロックとか1話とか)もう混乱しそう

みなさんはどう確認と対処をしているのでしょうか?
 
スイッチの設定ミスで変な挙動をするかもしれませんが
エラーまでは想像つきませんね。
プラグインを使ったイベントを組んでいるとか?

根本的には、1ゲーム通しでプレイしなければいけないのでそこを考慮する必要はありますね。
 

たまな

ユーザー
スイッチの設定ミスで変な挙動をするかもしれませんが
エラーまでは想像つきませんね。
プラグインを使ったイベントを組んでいるとか?

根本的には、1ゲーム通しでプレイしなければいけないのでそこを考慮する必要はありますね。
プラグインは基本的に補助的なものセーブ機能や死んだときにエンディングへいかないものなどですね
プラグインでイベント組めるようになるのは途方もなく先か無理かもです^^;

1ゲーム通してしなければならないことを考えるとセーブで起きるエラーは除去対象ですよね・・・
スイッチと変数と移動ルートくらいしか使えてないので^^;
やっぱりスイッチかなぁと思います
たぶん想定外でせっていされてない溝がありスイッチがはいらないのかも・・・
今、文章で各イベントページに数字をふって流れでどこが動いてるのかみてる感じですね
 

ジェミニ

ユーザー

たまな

ユーザー
こんばんは

「こういう原因でエラーが起きてるのではないか?」と考えて全部洗ってみるのもいいんですが、セーブ時にエラーが出たらコンソールにエラーログが出ているはずです。その内容から辿っていった方が早いと思われます。

このまえ、おそわったやつですね!
でも・・・全然英語もプログラムに弱いので見ただけで理解できるかが^^;
 

ジェミニ

ユーザー
そうですね。

エラーメッセージの全文がこのスレッドに貼られていれば、ファイル名だったりメッセージの中身が他の人にも見れるようになりますから、考える材料が増えます。

ですので、出力メッセージが理解が難しいものであっても公開していただけた方が回答はしやすくなります。
 
これはもしかしたら、ツクールの仕様のせいかもしれません。
「一旦セーブした後、プロジェクトをいじってセーブした場合、マップデータが再読み込みされる」
という仕様になっています。

たまなさんのケースでも、それまでのイベントの位置や、そのマップ独特のスイッチや変数を途中で加えた場合、
この仕様(ロード時にマップが読み込まれ初期化される)が原因なのかもしれません。

僕もこの仕様に、結構泣かされたことが多いです。
特に、バージョンアップ版を公開したら、古いバージョンのセーブデータを読み込もうとして
エラーが出る……ということがあって、困り果てていました。
よって僕は、「ロードする際、マップの再読み込みはしない」ように変更していました。
これだと、マップを切り替えないと変更が反映されませんが、エラーは起きなくなります。

若干強引にプラグイン化するなら、以下のような感じでしょうか。

追記2022.Jan.14 下記のプラグインは勘違いで書いたもので正常動作しません!!
JavaScript:
(() => {
  Scene_Map.prototype.create = function() {
    Scene_Message.prototype.create.call(this);
    this._transfer = $gamePlayer.isTransferring();
    this._lastMapWasNull = !$dataMap;
    if (this._transfer) {
        DataManager.loadMapData($gamePlayer.newMapId());
        this.onTransfer();
    } else if (!$dataMap) {
         DataManager.loadMapData($gameMap.mapId());
    } else if ($dataMap.id !== $gameMap.mapId()) {
        // abolish this action because it's the seed of trouble
        // DataManager.loadMapData($gameMap.mapId());
    }
  };
})();

いまでは、「デバッグモードの時だけ、マップは再読み込みするが、それ以外の時は再読み込みしない
という方向で落ち着いています。
 
最後に編集:

たまな

ユーザー
これはもしかしたら、ツクールの仕様のせいかもしれません。
「一旦セーブした後、プロジェクトをいじってセーブした場合、マップデータが再読み込みされる」
という仕様になっています。

たまなさんのケースでも、それまでのイベントの位置や、そのマップ独特のスイッチや変数を途中で加えた場合、
この仕様(ロード時にマップが読み込まれ初期化される)が原因なのかもしれません。

僕もこの仕様に、結構泣かされたことが多いです。
特に、バージョンアップ版を公開したら、古いバージョンのセーブデータを読み込もうとして
エラーが出る……ということがあって、困り果てていました。
よって僕は、「ロードする際、マップの再読み込みはしない」ように変更していました。
これだと、マップを切り替えないと変更が反映されませんが、エラーは起きなくなります。

若干強引にプラグイン化するなら、以下のような感じでしょうか。

JavaScript:
(() => {
  Scene_Map.prototype.create = function() {
    Scene_Message.prototype.create.call(this);
    this._transfer = $gamePlayer.isTransferring();
    this._lastMapWasNull = !$dataMap;
    if (this._transfer) {
        DataManager.loadMapData($gamePlayer.newMapId());
        this.onTransfer();
    } else if (!$dataMap) {
         DataManager.loadMapData($gameMap.mapId());
    } else if ($dataMap.id !== $gameMap.mapId()) {
        // abolish this action because it's the seed of trouble
        // DataManager.loadMapData($gameMap.mapId());
    }
  };
})();

いまでは、「デバッグモードの時だけ、マップは再読み込みするが、それ以外の時は再読み込みしない
という方向で落ち着いています。
あ・・・なんとなく、こころあたりがあるような^^;

でも、言ってることは解るけど、やってることがわからないという馬鹿さです・・・

もうしわけありません・・・
 
あ、どうも。いくつか補足です。

上記のプラグインですが、僕が勘違いして作ったため、正常動作しません
(元は、ツクールXPでやっていたことを、MZでやろうとしたゆえ)
もし、この関連のプラグインが必要なら言ってくれれば何とかします。

あと、「やってることがわからない」とのことですが、
セーブの際、次ロードしたら、マップが読み込みなおされる可能性がある」ってことだけ
知っておいて、気を付けてくれれば十分です。
 
トップ