投稿
けい kei0baisoku
広く使えるセーブ&ロード処理、アドバイス頂いて2点更新しました。 ・多次元配列にも対応しました ・区切り文字がセーブ内に含まれていた時に、警告を出して問題を回避するようにしました 前のバージョンは消していますのでご注意下さい。 【NDK5B3FD】
16そうだね
プレイ済み
返信[1]
親投稿
けい kei0baisoku
あ、一応補足です。 詳しい説明とか何ができるのかとかは、1日前の私の投稿も合わせてご覧くださいませm(__)m https://miiverse.nintendo.net/posts/AYIHAAAEAADHVHhrhJ2hsA
0そうだね
プレイ済み
返信[2]
親投稿
P£titP0cky taroson
けいさんのこのセーブロード処理のプログラムを、僕の"PETITWORLD"という2D横スクロールサンドボックスゲームのセーブ処理に使いたいのですが、よろしいでしょうか? セーブしたい配列変数がとても多くて…
0そうだね
プレイ済み
返信[3]
親投稿
P£titP0cky taroson
自分で作ったセーブ処理は配列に対応していなくて… できるだけ自分の力でなんとかしたいものですが、どうしていいのかわからなくて、よろしければ配列を保存している仕組みを教えて頂けませんか?
0そうだね
プレイ済み
返信[4]
親投稿
P£titP0cky taroson
できれば、プログラムを借りるより、仕組みを教えて頂ければ嬉しいです。 借りるだけより、教えて頂くと自分のためになるので…迷惑かもしれませんがお願いいたします。
0そうだね
プレイ済み
返信[5]
親投稿
けい kei0baisoku
>Pockyさん 喜んで!(^O^) 人気ゲームのお手伝いが出来るのはとても光栄です。 仕組みまで興味もって理解しようとする人もなかなか少ないのでとても嬉しいです。 ちょっと時間かかるかも知れませんが、自分でも確認して思い出したら整理して解説します。
0そうだね
プレイ済み
返信[6]
親投稿
けい kei0baisoku
配列のところだけで大丈夫でしょうか? 配列にも絡むので、一応全体の所から軽く説明します。 まず前提として、セーブする文字列内に決して出てこない文字を一つ決めて、それを区切り文字に使います。私のサンプルだとマイナーな記号にしてますが、説明のためここでは仮に「@」にします。
0そうだね
プレイ済み
返信[7]
親投稿
けい kei0baisoku
セーブは一つの長い文字列として保存しています。 "X=3@Y=2.300000@NAME$=ももたろう@BUKI$=こんぼう" のような形です。 =の左が変数名、右が値です。変数名の末尾が#か%か$かそれ以外かで型が分かるので、ロード時にVALを通すかどうかの判断に利用してます。 変数同士はさっき決めた区切り文字で区切ります。これでいくらでもたくさんの変数を保存できます。
0そうだね
プレイ済み
返信[8]
親投稿
けい kei0baisoku
で、ここからが配列です。 "OTOMO$[3]=INU@SARU@ONI@OTOMOLV[3]=3@5@63" 配列は、セーブする時に [要素数] を変数名の末尾に付けるルールにしています。DIMで宣言する時と同じ表記です。ロードする時は、[]が付いている事で配列であるのを判断して、中の数字で要素数を判断します。 =の右が値なのは普通の変数と同じですが、区切り文字で区切りながら要素数だけひたすら繰り返します。 次の変数との境目も区切り文字ですので、あらかじめ調べた要素数だけが頼りです。
0そうだね
プレイ済み
返信[9]
親投稿
けい kei0baisoku
仕組みは以上です。後はセーブ時にルールに従って文字列化し、ロード時に読み取って情報を復元するだけです。 ロード時の解析は、ルールはシンプルですがプログラムにすると結構やることが多いので、混乱しそうならあらかじめ手で紙に書いてアルゴリズムを把握しておくと良いかもしれません。 基本的にINSTRやMIDを駆使して気合いで地道に読み進めていく形になります。
0そうだね
プレイ済み
返信[10]
親投稿
けい kei0baisoku
あと、知らないとどうしようもない必須のテクニックについて補足です。 ・OLDX=VAR("X"): VAR("X")=15 のようにして、変数名の文字列から変数にアクセスできます。特にロードする時に必須です。 ・DIM TMP[0],AA[2,3],BB[2,3] COPY TMP,AA COPY BB,TMP のようにして、多次元配列→一次元配列、一次元配列→多次元配列、のコピーが出来ます。 多次元の方は要素数が合っている前提です。 セーブ処理ではこれを利用して、多次元配列も必ず一次元配列にペチャンコに潰してから保存してます。 以上ですが、この説明で行けそうでしょうか?
0そうだね
プレイ済み
返信[11]
親投稿
P£titP0cky taroson
とても丁寧で分かり易い説明ありがとうございました!
1そうだね
プレイ済み
返信[12]
親投稿
P£titP0cky taroson
けいさんの説明を元に自分でもいろいろやってみたんですが、結局、欠陥だらけのものができてしまい、使えそうにありません…けいさんのプログラムを実際にゲームに組み込んでみると とても使い勝手がよく便利で、自分が作ったものなんかより、けいさんの物を使わせて頂きたいと思いました… 使わせて頂いてもよろしいでしょうか?
0そうだね
プレイ済み
返信[13]
親投稿
けい kei0baisoku
もちろん構いませんよ(^O^) そのための公開ですし。 理屈のところで不明点が無いなら、あとは実装するときのミスによるバグじゃないかと思います。 (+1がいるか要らないかとか) ややこしい処理を組んだりデバッグしたりするのに慣れてるかどうかだけの問題ですので、あまり気にすることはないと思いますよ。
1そうだね
プレイ済み
返信[14]
親投稿
P£titP0cky taroson
ありがとうございます! 組み込ませて頂きます!
1そうだね
プレイ済み
返信[15]
親投稿
P£titP0cky taroson
組み込ませて頂きました! 結局、自分で作ったセーブ処理はゲームのオプションで設定したデータを保存する為だけの命令に...
0そうだね
プレイ済み
返信[16]
親投稿
けい kei0baisoku
おお!機能組み込みおめでとうございますー(´∀`) って、ハンパない自虐っぷりww そうですね、私も自然に見易いコードになる訳じゃなくて、プログラム組む上で一番見易さを重視して書いてます。 変数名長かったりコメント書いたり面倒ですが、バグも出ないし後で手も入れやすいしで、結局効率がよくなるので。 書くのは面倒なんで内容の複雑さとの相談次第ですが(´з`)
0そうだね
プレイ済み