「EnDlEss DREamER」ブログ

最近はunity5メインで活動中。以前はツクールRGSSネタなど。

§ セーブデータ圧縮(Zlib版)

http://mitsu-evo.6.ql.bz/RGSS2_57.html

★ 概要 ★

・セーブデータのサイズを圧縮して保存し、読み込む素材です。
・純正のデータと圧縮データをロードします。
・セーブ時は圧縮ファイルで保存します。
・圧縮形式は「gzip形式」拡張子は「.gz」です。
・圧縮されたセーブデータが作成されたら元の
 「.rvdata」ファイルは削除してください。
 重複していると圧縮データが反映されません。
・設定で圧縮率を大まかに設定できるので好きな値を入れてください。
・多分、RGSS1でも使用できます。
・圧縮に使っているライブラリはRGSSに入っている「Zlib」を使用しています。
・単純にサイズの軽量化を図るものなので暗号化などはありません。
・「スクリーンショット表示 Ver 1.0 by 半導体」
 http://h2so5.web.fc2.com/
 のスクリプトにのみ対応しています。
・セーブデータのレイアウトを大幅に変える素材とは恐らく競合します。
 改変等は自由ですので、分かる方は自由に改造してください。



ってことで、完成しました「セーブデータ圧縮(Zlib版)」
いやぁ~~~やればできるもんだねぇ~~~

簡単に説明するも何も、セーブするときに圧縮ファイル作成して、ロード時にそれを読む。だけです。

実は結構苦労した。
RGSSの話を詳しくすると、セーブ時は「Marshal.dump(obj,port)」って形式でアクターだったり
システムデータだったりを「バイナリの文字列」で書き出してセーブデータを作成する。

どーやってファイル作ってるの??
という方の為に簡単に解説。

  
  file = File.open('ファイル名', "wb")#「ファイル名」は作成ファイル名。「wb」はバイナリで書き込む。
  write_save_data(file)# 前述のMarshalで書き込む
  file.close# 開いたものを閉じます。


って感じでファイルを作成しています。
読むときは「rb」で指定して「Marshal.load」してグローバル変数に入れています。

で、RGSSには「Zlib」というライブラリが例外的に入っているので、実は圧縮できます。
で、圧縮ファイルを読んで、ファイルの中のデータを読み込んでMarshalでロードすればおk!

と思ったら、「最初のデータ」しか読んでくれず他のBGSとか一切読まない!!
どうやら「バイト文字列」を含んでいて「"\n"」までしか読まないらしい。
「Base64」に変換してやればいいらしいというのもあるようだけど、やり方が分からず断念。

なので、「\n」までは読むので、配列1個はロード可能なので「セーブデータ全部を一つの配列」にして
圧縮ファイルからロードして、配列から変数に入れていく・・・
という手順でこのセーブデータ圧縮は出来ています。

がんばってバイト文字列関係を解決できたら多分、普通のファイルとかもデータをバイナリ文字列にして
圧縮ファイルからロードとか出来そうだけど、圧縮ファイルから全部やったりすると重たい。
20Mのセーブデータを1M以内にして8個くらいセーブデータをタイトルから読まそうとするとちょっと重い。
その辺りは設定で、圧縮率とか調整してやれば動作が軽くなるかも知れないけど。


このスクリプト最大のウリは「スクリプト単体で使える」という所なので
初心者でも扱いやすい素材となってます。

テストプレイで元のセーブデータをロードしてセーブすると圧縮ファイルが作成されるんだけど
作成されたら「元のファイルは削除」して下さい。
でないと、セーブ画面にデータがロードされません。
元のデータか、圧縮データかどっちかにしておいて下さい。
因みに、解凍したデータは保存方法が違うので解凍しても使えません。
圧縮されたままで使用して下さい。


2011/05/26/Thu 19:36:23  思いつき/CM:0/TB:0/
new 小林可夢偉モナコ5位! / MAIN / 気がつけばスクリプト(^^ゞ old

COMMENT

COMMENT POST

/
/
/
/



 
 内緒です♪

TRACK BACK

  この記事のURL:
   http://edlogtkool.blog36.fc2.com/tb.php/767-7bf41a97


MAIN
copyright © 2006 「EnDlEss DREamER」ブログ. All Rights Reserved.
Template by TAE-3rd☆テンプレート工房