投稿
けい kei0baisoku
汎用的なセーブ処理を作ってみました!(^0^) SAVE_DATA "SCORE,PLNAME$" みたいな感じで、変数名をカンマ区切りで並べるだけで全部一括して保存&ロードできます。 公開キー出すほどでもないと思っていたのですが、思ったより長くなりました…(-ω-) ある程度読めれば、何をしているかはすぐ分かって応用出来ると思いますので、全部貼ってみます。
16そうだね
プレイ済み
返信[1]
親投稿
けい kei0baisoku
2/5ページ目
0そうだね
プレイ済み
返信[2]
親投稿
けい kei0baisoku
3/5ページ目
0そうだね
プレイ済み
返信[3]
親投稿
けい kei0baisoku
4/5ページ目
0そうだね
プレイ済み
返信[4]
親投稿
けい kei0baisoku
5/5ページ目
0そうだね
プレイ済み
返信[5]
親投稿
けい kei0baisoku
やってることは 「変数名と値をセットで文字列化して、全部並べて保存」 です。数値と文字列の変換はFORMAT$()とVAL()、変数名での変数へのアクセスはVAR()を使っています。 「使いたいけど意味が分からない!」などありましたら遠慮なく質問下さい。
0そうだね
プレイ済み
返信[6]
親投稿
けい kei0baisoku
この投稿のプログラムをそのまま使う場合に、一点注意です! 写真のプログラムでは、出来ないことが2つあります。 ・配列の保存とロード ・バックスラッシュを含む文字列の保存とロード これらも対応するなら、配列は要素ごとに何か決まった文字(カンマとか)で区切って保存、バックスラッシュは、保存したい文字列の中にもしバックスラッシュがあったら先に別の文字に置き換えておく、といった方法になると思います。 (後者はエスケープシーケンスと呼ばれます)
0そうだね
プレイ済み
返信[7]
親投稿
けい kei0baisoku
(エスケープシーケンスの例) \→`B(バッククォート+B) `→``(バッククォート+バッククォート) この2つの置換さえしてやれば文字列からバックスラッシュはなくなり、逆に変換すれば正確に元に戻ります。
0そうだね
プレイ済み
返信[8]
親投稿
くろちく FoliageLamp
打ち込みはエラーがでなくて、セーブが出て 画面に(1)~(3)がでて 1,1,2と=A=A=Bで いいのでしょうか? 理解より、打ち込むだけでいっぱいいっぱいでした。
0そうだね
プレイ済み
返信[9]
親投稿
けい kei0baisoku
全部打ち込まれたのですか!?(°Д°) おつかれさまです! それで合ってます! で、さらに何度も実行すると(2)と(3)が少しすずつ変わっていくと思います。 (1)のあとにセーブデータのロードをしてるので、最後に実行した状態をちゃんと思い出してますよ、という意味です。
0そうだね
プレイ済み
返信[10]
親投稿
くろちく FoliageLamp
(2)と(3)状態はちょっとづつ変わるっぽいのですが… (1)?が、AVE_STR$はそんざいしません。となります。 そして全部打ち込みました(笑) ジャイロ、モーションと連続したので打ち込みに力尽きました 実際には必要な部分を使うタイプ…なのかな。
0そうだね
プレイ済み
返信[11]
親投稿
おお〜。汎用の作ったんですね〜。 僕もまったく同じ仕組み(変数名を引数にして保存する)を考えていました。(内部ロジックは多少違いますが) ただけいさんが作ったということで、しばらくは需要もないと思いますし、僕自身が自分のプログラムで利用するために作成することがなかったら、しばらくは作るの止めようかなって思います〜。
0そうだね
プレイ済み
返信[12]
親投稿
けい kei0baisoku
おっ、そのエラーが出ると言うことは、21行目の「SAVE_STR$」の先頭の「S」が抜けてないでしょうか? 間違ってましたら、直して2、3度実行してみてください。 打ち込み本当におつかれさまでございます(´ω`) 必要な部分が2ページ目以降です。 1ページ目が使い方のサンプルに当たる部分ですので、2ページ目以降をコピーすればそのまま他のプログラムでも使えます。 セーブするファイル名だけ、決め打ちで書いてるので書き直す必要がありますけど。
0そうだね
プレイ済み
返信[13]
親投稿
けい kei0baisoku
>でんぺんさん おお、インターフェース同じですか(^O^) 引数はサンプル書き始めてから少し考えて詰めたのですが、でんぺんさんと同じならこれで良さそうですね。 変数名とセットで保存する考え方はコータさんからアドバイス頂いたのですが、基本的なやり方さえ気付けば慣れてる人は後は好きにカスタマイズできると思いますしね(´ω`) 初心者の人は応用するのは厳しいのと配列やバックスラッシュに対応できてないので、そこまでやって本当に「汎用」にしてから、公開キー発行すべきかちょっと悩み中です(´ω`) 需要、どのくらいあるのだろう……
0そうだね
プレイ済み
返信[14]
親投稿
そうですね〜。僕の考えでは、わかる人はそもそもとして自分でやるだろうというのがあったんで初心者向けにブラックボックス的になったとしても汎用的にしておいた方がいいかなと思っていました。(なので僕の考えていたものは配列に対応させて、さらにエスケープシーケンスを不要にするためにバイナリー保存にするかなって考えてました) 需要はあるとは思いますが、どこまでやるかは悩んじゃうところですよね。
0そうだね
プレイ済み
返信[15]
親投稿
けい kei0baisoku
おお、バイナリですか(°ω°) 作ってる時にセーブデータの中も見たいかなと思って文字列しか考えてなかったのですが、仕組みがシンプルになるならバイナリもありかも。 ちなみに、文字列の区切りの識別ってどんな感じで考えられてますでしょうか?CHR$(0)のヌル文字すら途中に有りうると聞いた気がしたので、絶対使われないコードがないからエスケープするしかないかなと考えてたのですが(´з`) アドレスとサイズをヘッダ的に持つ形式ならバッチリ対応できますが、流石に仕組みが複雑すぎるかなと……… あと、仕組みとか保存形式を単純にしておけば、最初はブラックボックスでも少し慣れたら改造もしやすいかなーと目論んでたり。エスケープシーケンスの時点でちょっと悩みどころですが………
0そうだね
プレイ済み
返信[16]
親投稿
セーブデータの中身もみたい(もっと言うなら書き換えたい)と言うことも考えると、僕はそれはセーブファイルとは違う別の設定ファイルみたいな感じの形式を作りたいなと思っていました。(手動書き換えがあるのを前提) 文字列は区切りという考え方ではなく「文字数,文字列データ」という形を想定していました。まあどちらにしてもそれなりに複雑になる可能性はあるんですが、基本ブラックボックス的な感じでもいいかなと思ってたぐらいなので、そこは気にしてなかったりします…。
0そうだね
プレイ済み
返信[17]
親投稿
けい kei0baisoku
なるほど、文字数だけセットで頭に情報を持っておくわけですね。場合によっては文字列保存の場合でも使えそうです。ありがとうございます(^O^) セーブの中を見るのはプログラムの正統な機能というより、どちらかというと「あれ?この情報ゲーム再開したら変になってるけどなんでだ?セーブはちゃんとされてるのかな?」みたいな時のデバッグ目的をメインで考えてました。あと、同じくチェック目的でセーブデータ弄ってデバッグもやりたくなるかなー、という辺りです。
0そうだね
プレイ済み
返信[18]
親投稿
実は僕のランチャーではバイナリー保存なので「文字数,文字列」で保存してます。ただ汎用性はないので、それを応用して、みたいに考えていた感じですね〜。 確かに通常でもテキストだとその辺は便利ですよね。 実は僕のランチャーもセーブ内容を直接書き換えたい場合を考えてテキスト形式に変更しようかと思ったのですが、始めがバイナリでどんな文字でも使える(アイコン記号として)ようにしてしまったので変更がしづらくて保留にしています…。 もしバイナリーでそういうことをやろうと思ったら専用のエディタを作る必要が出てきちゃいますねー…。
0そうだね
プレイ済み
返信[19]
親投稿
けい kei0baisoku
なるほど、でんぺんさんのツール系ですと明確に作る人と使う人が別れてますので、バイナリとしてまとめた方が扱いやすそうですね(´ω`) そう言えば、バイナリファイルとして保存したらプチコンでの閲覧方法は用意されてないですから、バイナリビューワ的なのを作らないと確認できないですね………。最低限のプリントなら数行で書けるとは言え。
0そうだね
プレイ済み
返信[20]
親投稿
くろちく FoliageLamp
上の方に書き込みがあるので、行数が違いますが 21行目の、間違いではなさそうに思うのですが。
0そうだね
プレイ済み
返信[21]
親投稿
けいさんとお話ししたとき、イメージいていたのは、保存時、 1)DATA文に、変数名の一覧を作り、 2)それを読みながら、変数名とデータのセットを区切り文字(改行や”、”)でつないで、1つの文字列を作り、 3)テキスト形式で保存する。 読み出し時は、 1)テキスト形式で読み出し、 2)変数名を切り出し、 3)変数の型によって、文字か数値かを識別し、値を読み出す。 4)2,3を文字列の最後まで繰り返す。 ぐらいのことで、配列変数の保存形式までは考えていませんでした。 インターバルタイマーの時は、VAL()の使い方を知らなかったので、ADD_INT,ADD_STR,GET_INT,GET_STRを作ってやったのですが、とりあえず力ずくでやったという感じでした。
0そうだね
プレイ済み
返信[22]
親投稿
けい kei0baisoku
>Leuchtさん ………合ってますね(・ω・) うむむ?なんでだろう。ダイアログのエラーは「AVE_STR$はそんざいしません。」であってますでしょうか? やっぱり間違い無さそうなら、お手数ですがエラーになる状態のプログラムをアップしてもらってもいいでしょうか?m(__)m 見るのちょっと遅くなるかもしれませんが………
0そうだね
プレイ済み
返信[23]
親投稿
けい kei0baisoku
>コータさん 補足ありがとうございます。 なるほど、DATA文に変数名をまとめるのもよさそうですね。 配列は使用頻度高いので必要になりそうですが、要素ごとの区切りさえ適切に出来れば、作るのが面倒なだけで実現は問題無さそうです。
0そうだね
プレイ済み
返信[24]
親投稿
くろちく FoliageLamp
ダイアログのエラーは へんすうAVE_STR$はそんざいしません。 ERROT:NO= と、でます。 変数なので何かの宣言を忘れているかミスっているかですかね。 エラー情報を正確に伝えてなくてすみませんーー; VK74S33J
0そうだね
プレイ済み
返信[25]
親投稿
保存時のCHKVAR()がFALSE時のエラー通知は必須だと思いますが、読み出し時には、CHKVAR()のFALSEを無視することでバージョンアップ時の情報引き継ぎが容易になるような気がします。もちろんデフォルト値の保証が必要になります。
0そうだね
プレイ済み
返信[26]
親投稿
けい kei0baisoku
>Leuchtさん ありがとうございます!(^O^) セーブデータが壊れててロード時にエラーになってる印象ですが、何度もセーブし直してもダメなら別の原因もあるのかも。 お手数かけてすみません。しばしお待ちくださいm(__)m(今日の夜目標) >コータさん ご提案ありがとうございます。 そうですね。最初、このサンプル自体のバグも心配でオンにしてましたが、安定したら存在しない情報はスルーが使いやすそうですね。 念のため確認ですが、デフォルト値の保証とはセーブデータには入っていなかった変数の値を、ロード時にどうするかということで合ってますでしょうか?セーブロード範囲外になりますが、プログラムの初期化処理できちんと初期化するのを徹底する、ということかなと理解しています。
0そうだね
プレイ済み
返信[27]
親投稿
けいさんへ その通りです。新規追加された変数が重要なデータの場合、デフォルト値を入れておかないと、変な動きをするのは、よくあるはまりパターンの一つだと思います。ゲームの場合には、初期値を設定しないということは、ほとんどないとは思いますが・・・
0そうだね
プレイ済み
返信[28]
親投稿
くろちく FoliageLamp
何度かセーブを繰り返してとのことだったので… セーブデーターを削除してから繰り返してみましたが 同じエラーが。 ロードの関数あたりで何かミスがありそうな気配です>< セーブ自体はエラーのあとできるのですが。
0そうだね
プレイ済み
返信[29]
親投稿
ロード時に”SAVE_STR$”の”S”が消えているので、位置の更新時にどこかで、余計に+1していると思います。 どこかは、まだわかっていません。
0そうだね
プレイ済み
返信[30]
親投稿
もし、SAVE時に作成されたファイルの内容に問題が無ければ、WHILEループの最後で+2している為と思われます。
1そうだね
プレイ済み
返信[31]
親投稿
コータさんの指摘通り120行目で+2してるのが原因ですよ。オリジナルどおり+1にすれば直ると思います。
1そうだね
プレイ済み
返信[32]
親投稿
くろちく FoliageLamp
>コータさん でんぺんさん ありがとうございます!エラーがでなくなりました。 エラーでわかればいいものの、まだまだ理解が足りないので 何がどうエラーしてるのか、???でした。
0そうだね
プレイ済み
返信[33]
親投稿
けい kei0baisoku
よっしゃ調べるぜーー と思ったらすでに解決してくださってる!(^O^) ども、すみませんです(´ω`) 一応自分でも見てみましたが、でんぺんさんのコメントの通りでOKです!(^O^) サンプルのクセに長いですよね!すみません!(><) これは早めに配列にも対応して公開キーかなぁ………(´ω`)
0そうだね
プレイ済み
返信[34]
親投稿
けい kei0baisoku
>コータさん 初期値の件、了解しました。 変数の初期化は鉄則………なのですが、プロの人間でもそこそこ頻繁に初期化漏れのバグをやらかします。プログラム覚えたての人だとなお難しいだろうなぁ…と感じます。
1そうだね
プレイ済み
返信[35]
親投稿
くろちく FoliageLamp
汎用的なセーブ処理なので、配列対応で公開キーは是非に。 あくまでも初心者?感覚ですが、打ち込みは…… なかなかハードでござった。 ほかの方はさらっと打ち込んでるかもしれません><
0そうだね
プレイ済み
返信[36]
親投稿
けい kei0baisoku
多分………これを見て迷わず打ち込んでいく根性のある初心者さんは、Leuchtさんくらいだと思います(・ω・) よし!要望も頂きましたので、作るのを決意しました。 ただ、今考えてるのはエスケープシーケンスとか使ってまで本当に万能にはせず一部の文字は犠牲にして、少し慣れたら改造もしやすいように、で考えています。
1そうだね
プレイ済み