RGSS-共通データ・おまけデータ作成

カテゴリ: 投稿日: 2016-10-19
«RGSS一覧/利用規約

今回はSilverHeartsゲームでもよく使っている、
本編セーブデータとは別に記録される共通データの作り方について書いていきます!
SilverHeartsではこういう作り方が楽でしたというお話です。
雑でもいいから作ってみたい!という方は続きをどうぞ♪



変更点ではなく、全て新規に作成します。

■データの中身を作成

スクリプトエディタへ新しく挿入でクラスを作成します。
例ではSpecial_Dataですが、クラス名は自分の使いやすい名前にします(他のクラスと重複すると、下に書いた同名クラスが実行されるので注意)

例)
 class Special_Data
   attr_accessor :ending #エンディング
   attr_reader :flag #フラグ数
   def initialize #初期値設定
    @ending = false
    @flag = 0
  end
 end

ひとまず例ではエンディングに到達したか、フラグ数はいくつか、という変数を用意。
attr_accessor :というプライベートメソッドは読み書き両用、attr_reader :は読み取り専門。
この違いは、クラスのインスタンスを生成した変数(変数A = Special_Data.new)で読み書きできるかどうかで
attr_readerに設定した@flagは"変数A = 10"や"変数A += 10"といった代入や計算、変更はできないけど値は読み取れますよ~というもの。
attr_accessorは代入、加算などが可能です。
readerにしたものはクラス内での計算はできます。
attr_writerはreaderとは逆に、書き込み専門で読み込みができません。滅多に使わない…かな?

↓こういうメソッドと同じ役目。

 def reader #読み取り
  @flag
 end
 def writer=(val) #書き込み
  @flag = val
 end

def readerとdef writer両方で読み書き両用と同じ作用。
*ツクールXPヘルプのModuleのページに書いてあるので参考に。

…という事で、プライベートメソッドで書いた方がすっきりするみたいです。
デフォルトのスクリプトでよく目にするのを真似て自分なりに解釈したので、参考になるかわかりませんが(汗)


■使い方

じゃあどうやって新しく書いたおまけデータを使うの?
というのはここから説明します。

★おまけデータを読み込む(初期化orつづきから)★

まず、最初からおまけデータはセーブデータ同様にフォルダ内にはありませんよね。
おまけデータファイルが無い時は新規に、さっき作ったSpecial_Dataクラスを読み込みます。

Scene_Titleクラスのmainメソッド内
"$game_system = Game_System.new"の上あたりで読み込ませちゃいましょう。

 if FileTest.exist?("special.rxdata") #special.rxdataがゲームフォルダに存在するか判定
  file = File.open("special.rxdata", "rb") #存在するならファイル読み込み
  $omake_data = Marshal.load(file) #$omake_dataにspecial.rxdataの内容を読み込み
  file.close #closeしないとエラーが起きることもあるのでしっかり記述
 else #おまけデータが存在しない時
  $omake_data = Special_Data.new #新しく$omake_dataにSpecial_Dataクラスを読み込み
 end

使う前に読み込んでおけばいいだけなので本当はGame_Systemの上じゃなくても大丈夫です。
音量設定なんかを扱うオプションデータにしたい時は、ここが多分ベストかなと思いますが。
あと、おまけデータの@ending変数がtrueの時だけタイトル画面に「おまけ」の選択肢を出現させたい!なんて時はTitleの選択肢を作成する前に読み込んでおくように。
通常セーブ読み込みと同様の処理をしています。


★おまけの変数を変更★

グローバル変数にしておく事で、ゲーム内のどこでも$omake_dataでおまけデータの判定ができるようになりました。
どうやって@endingをtrueにするか、falseにするかはスクリプトをいじった人ならわかるので割愛…するとあれかなーと思うので。
attr_accesorで読み書き両用の@endingは
$omake_data.ending = true
これだけでOKです。
attr_readerにしているflagは$omake_data.flag = 10のように変更はできません。
クラス内でのみ変更できるのですが、とにかくどこでも代入加算減算できるようにしたいなら全部attr_accessorでもいいかな…(投げやり)


★おまけデータを書き込む★

エンディングフラグをtrueにしたらデータセーブしなきゃ、ですよね。
イベントスクリプトでも何でも、ぽんと数行でおまけデータのセーブは簡単です。
アラ意外(‘∀‘)ネジが飛んできた

 file = File.open("special.rxdata", "wb") #書き込むデータ設定
 Marshal.dump($omake_data, file) #$omake_dataをまるっとspecial.rxdataに書き込みます
 file.close #ここもしっかりcloseで終了

これでセーブされたはず…
デフォルトの通常セーブデータの書き込み、読み込みを見るとわかりますが
システムからスイッチ、プレーヤーデータと複数の変数を書き込んでいます。
おまけデータでも可能ですがあまり使わないかな。
複数の場合は、ロード時にセーブ時と同じ順序じゃないとうまく読み込まれずエラーが発生する事があるようですぞ(←試してみた人)
上記の設定方法なら簡単におまけデータが作成できるので、周回データ作りたいとか、総スコアデータ作りたいとかそんな時にお試しあれ。




以上、おまけデータの作り方でした。

ゲーム本編のセーブデータとは別に、ゲーム全体に関わる共通データ(オプションやおまけ判定)を作りたい時に便利かなと、今更ですが書いてみました。
おまけデータのクラスでdef~とメソッドを作って色んな処理をさせるとか、便利な事もできるんですが、そこらへんはここでは書きません。
時間があれば自分でスクリプトに触れて工夫してみてねという事で。
いつものように手探りスクリプト講座でありんした!