[解決済み]ゼル伝風アクションRPG セーブによる敵ダメージのエラーの対処方

ケイジロー
記事: 3
登録日時: 2021年11月24日(水) 22:32

[解決済み]ゼル伝風アクションRPG セーブによる敵ダメージのエラーの対処方

投稿記事by ケイジロー » 2021年11月24日(水) 23:05

はじめまして。
つい先日アクションRPGを作りはじめ、偉大なる下記のサイト様を参考にし一通りのダメージ処理等を行えるようになったところであります。↓
https://fermiumbay13.hatenablog.com/ent ... /01/120613

しかしながら、こちらの記事にもある「どこでもセーブは禁止の制約」のせいなのか、セーブして一旦ゲームを終了し、ロードしたデータで敵を攻撃すると1枚目の画像(Reference Error画像)のエラーが起こります。画像は上記のサイトにて配布しているサンプルゲームにて起こったエラーのスクリーンショットです。

こちらの画面でF12キーを押下し、デベロッパーツールを立ち上げては見たのですが、ゲーム制作初心者である私のスクリプトに対する知識が少なすぎてイマイチ対処法がわかりません。(2枚目の画像)

ニューゲームの場合は通常どおり敵に攻撃が行え、倒すこともできます。
自分なりに要所要所に「セーブ禁止及び許可の並列イベント」を置くことや「敵のいないエリアでのポイントセーブ」の実装等も試しましたが、同じエラーが起こります。

セーブを実装することは不可能なのでしょうか?
何か解決策をご教授願いたいです。何卒、よろしくお願い申し上げます。
添付ファイル
エラー1.PNG
エラー2.PNG
エラー2.PNG (44.89 KiB) 閲覧数: 237 回
最後に編集したユーザー ケイジロー on 2021年11月25日(木) 17:09 [ 編集 1 回目 ]

アバター
WTR
記事: 494
登録日時: 2015年12月22日(火) 19:14

Re: ゼル伝風アクションRPG セーブによる敵ダメージのエラーの対処方

投稿記事by WTR » 2021年11月24日(水) 23:58

講座の内容はほとんど読んでないので細かいことは把握してませんが
エラーメッセージはそのままの意味で変数 enemyDamage が未定義だということです。

講座第3回のページの中ほどに

コード: 全て選択

enemyDamage = new Array(999);
for(var i = 0; i < 999; i++){
    enemyDamage[i] = 0;
}

というスクリプトで enemyDamage を定義しているところがありました。
が、残念なことにこの定義はセーブデータには保存されないので
ロードしたあとに enemyDamage を参照しようとするとエラーになります。
このイベントはロードしたあとは戦闘の前に毎回実行する初期設定的な位置づけなんじゃないでしょうか。
毎回イベントを実行して定義するか、あるいはセーブデータに保存されるゲーム変数を代用することでも回避できると思います。

回避できるとは思うのですが
よくわからないスクリプトを使うということ自体のほうがより本質的な問題かと思います。

わからないことはこれからわかるようになればいいだけだと思いますが
わからないまま作り続けられるかというとそう甘くはないので
その点は覚悟して臨む必要があるかと思います。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
ケイジロー
記事: 3
登録日時: 2021年11月24日(水) 22:32

Re: ゼル伝風アクションRPG セーブによる敵ダメージのエラーの対処方

投稿記事by ケイジロー » 2021年11月25日(木) 11:17

WTR様 
お早いご回答、誠にありがとうございます。

セーブデータに保存されない変数(enemy damage)を使用しているので、ロード後のデータだと存在しない変数を参照しようとして起きるエラーである、ということでしょうか?

enemyDamage = new Array(999);
for(var i = 0; i < 999; i++){
enemyDamage[i] = 0;
}

↑をそのままメモ帳エディタに貼り付け、jsファイルに書き出したものをプラグインファイルに入れ、ゲームのプラグイン管理でこちらを有効(ON)にしたところ、ロード後のデータであってもエラーが起こらなくなりました。

しかしながら、この方法は「その場しのぎ感」が強いというか、根本的な解決にはなっていないような気がします。…この方法はあまり好ましくないのでしょうか?
アバター
WTR
記事: 494
登録日時: 2015年12月22日(火) 19:14

Re: ゼル伝風アクションRPG セーブによる敵ダメージのエラーの対処方

投稿記事by WTR » 2021年11月25日(木) 13:01

ケイジロー さんが書きました:セーブデータに保存されない変数(enemy damage)を使用しているので、ロード後のデータだと存在しない変数を参照しようとして起きるエラーである、ということでしょうか?

はい。その通りです。

推奨される手法かどうかは別として
起動時に毎回読み込まれるプラグインに記載することで
さしあたってエラーが出なくなるというのはロジックとしては正しい。

回りくどい表現になりますが…
何やってるのかわかったうえで書いているのであれば、本質的な解決策と言えなくもない、と思います。

そのスクリプトは
enemyDamage : [0, 0, 0, 0, ..., 0]
と 1000 個の 0 が続く配列を初期化しています。

この enemyDamage の各要素はゲーム進行によって 0 でない値に変化していくはずですが
それは保存しなくていい値なのか。
保存する必要があるなら今の方法では NG となりますね。毎回 0 に戻っちゃいます。
それはゲームデザイン次第なので何とも言えませんが、しなくてもいいのかなという気はします。

そういうことをわかったうえでないと
講座に書いてある通りにしか作れない、ただの作業になってしまいます。
のちのち自分なりの工夫を盛り込みたくなった時に
なにをしているのかわからないスクリプトの存在は障害になるので、よく理解するよう努めたほうがよいと思います。

あとは…
講座の内容も含めてですが、グローバル空間に好き勝手に変数を作るのは一般に推奨されません。
どの程度非推奨なのかというのは人によるし、これもわかっててやってるのかどうかで変わる気がします。

ずっと歯切れが悪くてすみませんが
絶対ダメ、ということもないと思いますよ、くらいでしょうか…
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
ケイジロー
記事: 3
登録日時: 2021年11月24日(水) 22:32

Re: ゼル伝風アクションRPG セーブによる敵ダメージのエラーの対処方

投稿記事by ケイジロー » 2021年11月25日(木) 17:09

WTR様
引き続き返信していただき、誠にありがとうございます。

「0に戻る」=マップ変更時に敵キャラのダメージがリセット(全回復)される。
これをリセットさせないようにするためには「保存」をする必要がある。(そのために件のスクリプトの書き換えが必要)
と、私は解釈しました。(違っていたらすみません。)


今回は「ロード後のエラー問題」をその場しのぎではありますが対処することができましたため、表題は「解決済み」にさせていただこうと思います。

丁寧にスクリプトに対する考え方と取り組む姿勢についてご教授いただき、とても感謝しております。
ありがとうございました。
アバター
WTR
記事: 494
登録日時: 2015年12月22日(火) 19:14

Re: [解決済み]ゼル伝風アクションRPG セーブによる敵ダメージのエラーの対処方

投稿記事by WTR » 2021年11月25日(木) 20:21

ケイジロー さんが書きました:「0に戻る」=マップ変更時に敵キャラのダメージがリセット(全回復)される。

プラグインに初期化処理を記述しただけの今の状態だと、マップ移動ではリセットされません。
マップ移動でリセットしたい値なのであればこの対応はダメそうですね。

講座の4回目のページに初期化処理の考え方が書いてあるようですよ。
マップ移動毎にイベントを実行する、と指示があるのでそういう想定で組んでいる講座なのでしょう。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/

“MV:質問” へ戻る