Scratchのデータセーブ・ロード事情
ScratchはプログラムからCookie等のローカル環境にデータを保存できない。
つまり、ゲームを進めても作品を再実行したりページを再読み込みしたりすると進捗は失われる
「クラウド変数」を使ってデータを保存することも可能だがそちらの方法の説明はここでは割愛 クラウド変数は英数字のみ、256文字まで、プロジェクト内に10個までの制限がある
以前は一つのクラウド変数に1万文字以上格納できたが、規制強化とサーバーリソース確保のために大幅に文字数が減ってしまった
Scratchでセーブ機能を実装するにはドラクエの「ふっかつのじゅもん」の形式を取る。
ゲームの進捗状況、例えばアイテムの保有数などのデータを文字列化してまとめ一つのコードにする
コードを読み込み画面で入力することで、そのコードを発行したときのデータを復元できる
表示したリストの項目はトリプルクリックで内容を全選択できる。
選択した後はそのままCtrl(Cmd) + Cキーでコピーもできる
コピーしたコードをメモ帳アプリなどで保存してもらうことでセーブを実現できる
セーブコードの入力には「( )と聞いて待つ」と「答え」を利用する。
ここでセーブコードを入力させデコードすることでデータを復元、つまりロードを実装できる
https://scrapbox.io/files/67053af2792e05001d4f165d.png
実装例
例1.それぞれ2桁であることが確実な変数「リンゴの数」「ミカンの数」「ブドウの数」をセーブする場合
↓セーブさせたいデータを全部繋げて一つのコードにする
https://scrapbox.io/files/67053af6b6db0b001dae8d5d.png
↓ロード時もコード内の対応する場所の文字を読めばok
https://scrapbox.io/files/67053af8d10004001c4be94c.png
例2.データの大きさが可変長(データの文字数が変化する)場合
Scratchは文字列の処理が他の言語に比べて圧倒的にヘタなので実装が一気に難しくなる。
Split関数も正規表現もなければスライスもない
ちなみに標準で無いだけなので、自分で実装することはできる
ロード時にデータを区切る場所を明確にするために、データとデータの間にカンマを入れておく
見やすいのでカンマにしたがそれじゃなくてもok
https://scrapbox.io/files/67053b0645c4c2001ec56a95.png
コードの先頭から一文字ずつ読んで値をリストに追加していく
https://scrapbox.io/files/67053b087ce716001dd05f0a.png
「デコード」の引数に"1, 234, 5678"を渡して実行すると「データリスト」に1, 234, 5678という項目が追加される
そうしたらリストの中身を一つずつ参照して変数に代入すればヨシ!