投稿
nobu divine-creator
ソフト内で設定を変更して、それを保存(記憶)させたいと思ったら、どのようなプログラムを使ったら良いでしょうか? それと同様に、プレイ途中のデータをセーブさせたい場合にも、どのようなプログラムを使ったら良いでしょうか? (ただし、任意のタイミングでセーブできてしまうと大変になるので、決められたシーンでのみセーブ可能という感じにしたいのですけど…。) 初心者でも分かりやすいように、教えていただけるとありがたいです。
2そうだね
プレイ済み
返信[1]
親投稿
nobu divine-creator
それと、設定の保存(記録)と似ているのですが、選択肢を選んで分岐する時に、ある選択肢を選んだ結果を保存(記憶)させておき、別のシーンでその結果を反映させたい場合には、どのようにしたら良いのでしょうか?
0そうだね
プレイ済み
返信[2]
親投稿
Villit nakahara1226
本文の方は、少しヒントを。 『SAVE LOAD等の命令では、文字列変数を書き出したり、文字列変数に読み込んだり出来る』 コメントの方は 『それぞれに対応した変数を用意する』しかないです。
0そうだね
プレイ済み
返信[3]
親投稿
よっぱらい yopparai1965
文字列ということは、複数の数値をカンマ区切り等で表現することで、1つの変数として扱えますよ!
0そうだね
プレイ済み
返信[4]
親投稿
nobu divine-creator
ウワァΣ(゚Д゚)!私の苦手な単語が…!変数&文字列変数ですか…。 答えてくださったのはありがたいですけど、残念ながら書き込まれた内容が正しく理解できません…。 数字と文字をどう扱えば、うまくいくのかイメージができません…。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
数値をセーブするならば数値配列変数に入れてDATとして保存するのが最も簡単です。 ただし、セーブするデータに数値と文字列が混在している場合は厄介です。 その場合は2回に分けるかどちらかの型に変換する必要があります。 文字列を数値に変換する場合は1文字ずつ取り出してASCで変換します。 数値を文字列に変換する場合は6桁までの整数ならばSTR$を使うのがベターですが、それ以外となると桁数を指定してFORMAT$を使うのがベターでしょう。 小数の場合は桁数指定が難しいですが難しければ小数点以下324桁保存しておけば問題ないです。 あと文字列は適当な区切り記号で区切って一纏めに保存しておいて、ロードの際はその区切りから元の形に戻すプログラムを作る必要があります。 難しければ数値と文字列の2回のセーブを行うのが最も簡単です。
1そうだね
プレイ済み
返信[6]
親投稿
よっぱらい yopparai1965
汚くて申し訳ないが、参考になれば… 一番上です。
0そうだね
プレイ済み
返信[7]
親投稿
nobu divine-creator
おちゃめさん、様々なパターンの保存法を詳しく解説していただき、ありがとうございます♪ 市販されているソフトなら、ほぼ全てのソフトで実装されている設定の変更とセーブ機能ですが、それを自分で作ろうとすると、予想を遥かに越えるほど難しいものなのですねΣ(゚Д゚)! 今まで当たり前のように、設定を自分好みに変更したり、「任意のタイミングでセーブできないと不便だ…」なんて、不満に思うことがあったりしましたけれど、その裏ではプログラマーの苦労があったのですね…。
2そうだね
プレイ済み
返信[8]
親投稿
nobu divine-creator
よっぱらいさん、わざわざ見本を作ってくださり、ありがとうございます♪ しかし、私の理解力不足で、このプログラムがどういうもので、どのように参考にすべきか?が分からない状態です…。 どうも、高度なプログラムをEDITモードで拝見しても、何が何だか分からない…というのが初心者の現状です…。
0そうだね
プレイ済み
返信[9]
親投稿
よっぱらい yopparai1965
ごく簡単に言うと、プログラム内の変数A・B・Cを保存するということです。 で、ただ単にSAVEやLOADだけではつまらないので、数字を3つ入力して貰って、それを保存するようにしました。 数字を3つ入れると、それぞれの変数内を表示します。 気に入れば、-1を入力してください。 そうすると、最後に入力した数字がSAVEされます。 次回起動すると、SAVEした数字が表示されます。 DEFでPRMGETという命令を作っていますが、これはおちゃめさんが言っている「元の形に戻すプログラム」に相当するものです。 SAVEの形式は、「数字文字列,数字文字列,数字文字列」で、例をあげると、"12,34,56"のような感じですね。 もしかすると、最初にファイルを作ってあげないといけないかもしれませんね。 その時はダイレクトモードで、以下のとおり SA$="0,0,0" SAVE"TXT:PRG000",SA$
0そうだね
プレイ済み
返信[10]
親投稿
よっぱらい yopparai1965
注目点は、LOADとその後に続くPRMGET(保存したものを読み出す)。 FORMAT$とその後に続くSAVE(保存する)ですね。 PRMGETはSAVEしたい内容によって変えれば、変数の数を変更するとか、文字列もSAVEするようにするとか、区切り文字を別の文字にするとか、いろいろできると思います。 まぁ、じっくり見てくださいな!
0そうだね
プレイ済み
返信[11]
親投稿
けい kei0baisoku
nobuさんの「セーブ機能を作るのは難しい」に同感です。 厳密には難しいと言うよりは、ゲームごとに何をいつセーブしたいかがマチマチなので、毎回その担当のプログラマがほぼゼロから工夫して考えないといけないんです。 プチコンで「スプライトを出して動かす」のがたった2命令で出来るのに「ゲームの状態をセーブする」がほとんどゼロから作らないといけないのも、「セーブ」が何を指すかが人によってマチマチで一般化しようがないからじゃないかなと思います。 というわけで、nobuさんが今作っているものも作りたいものに合わせてセーブの仕様を考える必要があるので、まず変数を保存したり復元したりという基本の所を理解して頑張ってみてください(-ω-)/
3そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
セーブプログラムはセーブするものの内容によって変えなくてはいけないため難しいですが、プチコン3号はプチコンmkIIと比べるとかなり改善されています。 何せmkIIはセーブが可能な変数はシステム変数のMEM$だけでした。 mkIIは文字列は最大で256文字しか扱えないため1度に256文字分しか保存できないわけです。 これではデータ量の多いゲームでは辛いためGRP(1つ48KB)を使って保存する方法が考えられました。 しかし、mkIIは保存するための領域が小さかったためGRPでバンバン保存していったらすぐに一杯になりました。 そこで、GRPをスプライトなどのCHRリソース(1つ8KB)に変換して保存する1行プログラムを作りました。(256バイトの1つ上がいきなり48KBというのはさすがに辛いけどCHRリソースは特殊であるため直接セーブ用には使いにくいため変換プログラムで代用した)
0そうだね
プレイ済み
返信[13]
親投稿
nobu divine-creator
プチコンMk2は、DLして起動したら全く分からず挫折し、DSiウェアの保存容量の関係で、ほとんど使わずに削除…という勿体無い事をしてしまいました…! そのため、3号との違いをコミュニティの噂話でしか知らなかったのですが、セーブに関しても大きく異なっていたのですねΣ(゚Д゚)! 現在作成中のプログラムに、セーブ機能を付けるかは決まっていなかったのですが、今後のプログラムには必要になるであろう機能なので、今回質問をしてできるようになっておきたいなぁ…と考えました♪ もし上手くできたら、作成中のプログラムにも実装できたら良いかな…と思っています♪
0そうだね
プレイ済み
返信[14]
親投稿
ナツキ natukin1978
確かに、けいさんの言われた通り今作ってる物に合わせてセーブデータの仕様を考えるというのは重要だと思いました。 私は実用ツールというジャンルのプログラムを作ってますが、機能をどんどん追加してバージョンアップする度にセーブデータに互換性が無くなると(私と利用者がお互いに)困るのでXMLの様な形式を採用しました。 いきなりXMLとか言われても分からないと思いますが、上で、おちゃめさんが挙げられた「適当な区切り記号で区切って一纏めに保存」と同じ考えです。 この形式は上手く扱えばデータ互換性が高く、後からデータを追加したり、削除したりがそこそこ簡単に行えます。 これを採用する事がnobuさんにとって最良の選択になるとは限りませんが、もし私と似たような特性のツールを作るという事になった場合は参考になるかもしれないと思いました。 長文失礼しました。
1そうだね
プレイ済み
返信[15]
親投稿
nobu divine-creator
XML(Extensible Markup Language)ですか…初耳でした! 確かに、プログラムの互換性って大事ですね。プチコン3号の場合は、特別なBasicということですけど、プログラムの名前が他の人の作品とかぶるだけでも、上書き対象になってしまったり、保存してあるソフトの名前を見ただけでは、どんなソフトか分からなかったり、「様々な形式の統一」や「トラブルを未然に防ぐための規格作り」をしっかり考えないと!…ですね。 そういう意味では、データの追記や削除をしやすくする形式を使用するというのは、有効な手段ですね♪
1そうだね
プレイ済み
返信[16]
親投稿
けい kei0baisoku
関係してくるのは、複雑にデータを保存していて、かつソフトをバージョンアップする場合に限られますが、互換性を保つって確かにメチャメチャ大事ですね。 市販のゲームなら当然死守しないといけないです。 どのくらい大事かって、プチコンのバージョンアップで一部の命令の使い方に互換性がなくなりエラーになると、コミュが阿鼻叫喚に包まれるくらい重要です(`・ω・´;)
1そうだね
プレイ済み
返信[17]
親投稿
ナツキ natukin1978
補足ですが「XMLの様な形式」と表現したのは、あくまでXMLもどきであって厳密にはXMLではありません。例を挙げると実際には文字列に特別な変換処理をかけたりしないといけないからです。 しかし私のツールで扱うデータの構造上、変換が不要と判断したので「XMLもどき」で進めました。それは、今作ってる物に合わせてセーブデータの仕様を考えた結果です。 色々と考える事があって大変だと思いますが、nobuさんにとって最良の手段が見つかると良いですね。
0そうだね
プレイ済み
返信[18]
親投稿
nobu divine-creator
そうですね♪プチコン3号のバージョンアップに伴ったエラーの発生は凄かったですね!当時、私はまだSPを使用していなかったので、影響がほとんど無かったのですが、TALKの変化によるエラーの影響は受けたので、少し混乱してしまいました…。 押されたボタンの判定について、おちゃめさんが推奨する書き方を解説されていたのを拝見した時に思ったことですが、「誤作動を起こしにくい書き方」って重要ですね! 指定したボタンではない別のボタンが押された時の影響とか、操作する人の行動を先読みした仕組みを設定していないと、エラーが発生してしまうということですよね…?! 今年になってからプログラミングを始めて、約三ヵ月しか経っていないので、まだ分からないことだらけですが、なるべく早めにセーブ機能を使えるようになりたいと思います♪
2そうだね
プレイ済み