RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座 023回
セーブ、ロードを作成1 場所情報だけセーブ


kouza023 jarファイル


[セーブ、ロードを作成した]

プレイヤーの場所情報しかセーブしていないので、
ステータスの変動やアイテム購入などをしても全てリセットされる。
そこら辺のセーブはデータ量が半端なく多いので、段階的に実装する。
次回はステータスのセーブか、アイテムのセーブを作る。
StatusWindowクラスに追加する形でDataSaveLoadクラスを増やした。
タイトル画面でもこのクラスは使うが、現状タイトル画面は最後に作る予定。

[DataSaveLoadクラス]
前作からコピペしたが変数名を変えたのでそのまま使うとエラーになる。
後々使う分までごっそり書いてあるが、軒並み作り直す。
まずは基本の場所移動部分だけ使えるように作り替えた。
posload,possave以外まだ使えないので除外しておく。
ソースコード上はコメントアウトなどで使えなくしてあるが、まるっと残っている。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class DataSaveLoad {

int fileNum=0;

public DataSaveLoad() {
init();
}

public void init() {
fileNum=0;
}
//-------------------------------------------------------------------------------------------------------------
//[data save]
//
//ここでPropatiesファイルとしてゲームデータ各種をセーブする。ロードも作ること。
//ネックは一要素=一変数しか格納できないこと。相当データ数が要るぞ…。
//一個一個保存していたら気が遠くなる…。が、反復して使える要素も多いので入力の手間はそれほどないかも。
//ユニット、座標、アイテム、フラグに大まかに分ける。ユニットは1キャラ1ファイル。
//-------------------------------------------------------------------------------------------------------------
public void dataSave(int fnum,GameData gData) {
//まず初期化。
init();
//ファイルナンバーをここでキープ。あとで複数使うので変数化しておく。
fileNum=fnum;
for (int i=0;i<=9;i++) {
//unitDataSave(i,gData.uData[i]);
}
//プレイヤーのx,y座標、マップナンバー等を一つのファイルにまとめる。
posSave(gData);
//アイテムのデータもセーブする。まだ実装してないけど。
//ゲームデータをセーブする
//gDataSave(gData);
}

public void posSave(GameData gData) {
try {
String fileName="";
Properties properties = new Properties();

int[] xy=gData.pPlatform.getxy();
for (int i=0;i<=2;i++) {
fileName="pos";
fileName+=String.valueOf(i);
properties.setProperty(fileName, String.valueOf(xy[i]) );
}

int[] mapNum=gData.mapNumber;
for (int i=0;i<=2;i++) {
fileName="mapNumber";
fileName+=String.valueOf(i);
properties.setProperty(fileName, String.valueOf(mapNum[i]) );
}

//座標データの保存 ファイル名はLoadでも使うので関数を使って作る。
//フォルダ構造を使わず、徹底的に同じフォルダにデータを格納する。
fileName="SD"+fileNum+"_pos.properties";
System.out.println("filename="+fileName);
properties.store(new FileOutputStream(fileName), "Comments");
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}

propertiesとか訳の分からない分が並んでいるが、properties形式のファイルを作ってそこに書き込む、という事。
使い方は丸コピーしてもらえばいい。意味も分からず使っているので、説明できない…。
properties.setProperty(fileName, String.valueOf(xy[i]) );

pos0にxy[0], pos1にxy[1],pos2にxy[2]の数値を代入して記憶しているという事。
読み込むときはこれの逆操作を行う。
propertiesファイルに書き込めているかどうかを確認するには、ファイルをテキストファイルで開けばわかる。
変数を読み込みやすい形にして保存しているという風に考えればいいかもしれない。
他にもっといいやり方があるかもしれないが、これしか保存方法をしらない。

properties.setProperty(fileName, String.valueOf(mapNum[i]) );
これはmapnumberを記憶している。
ロードするときにプレイヤー座標、マップナンバーを使って再度マップを作り直す、という感じ。
ロード時に強制的に場所移動イベントを起こす。
ロードすると画面上の一時的に消えたイベントは復活する。
敵の上でセーブしていたら即戦闘に入る…。

//所持金、所持品、フラグなどをまとめてセーブする。
public void gDataSave(GameData gData) {

}
//-------------------------------------------------------------------------------------------------------------
//[data load]]
//
//
//------------------------------------------------------------------------------------------------------------
public void dataLoad(int fnum,GameData gData) {
//まず初期化。
init();
fileNum=fnum;

//ユニットデータを読み込む。
for (int i=0;i<=9;i++) {
//unitDataLoad(i,gData.uData[i]);
//参照渡しではなく、unitdataを作って戻す形にしないとデータが反映されない。
//gData.uData[i]=unitDataLoad(i);
}
//System.out.println("name="+gData.uData[0].name +" saisyu- loadvst0 ="+gData.uData[0].total_vst[0]);
posLoad(gData);

//uDataへのグラフィックの登録は? ここで再度読み込ませるか。graNumberを元に呼び出して代入。
}

public void posLoad(GameData gData) {
try {
String fileName="";
String folderName="";
Properties properties = new Properties();

//座標データの読み込み。まずはpropertiesファイルを読み込む。セーブとは逆処理になる。
fileName="SD"+fileNum+"_pos.properties";

properties.load(new FileInputStream(fileName) );
String str=properties.getProperty("pos0");
System.out.println("pro = "+str);
int[] xy=new int[5];
for (int i=0;i<=2;i++) {
fileName="pos";
fileName+=String.valueOf(i);
//stringをintにもどして変数に格納していく。
//System.out.println("fileName= "+fileName);
xy[i]=Integer.parseInt(properties.getProperty(fileName) );

}
int[] mapNum=new int[5];
for (int i=0;i<=2;i++) {
fileName="mapNumber";
fileName+=String.valueOf(i);
mapNum[i]=Integer.parseInt(properties.getProperty(fileName) );
}

//xy、mapnumをgDataに反映させる。
gData.pPlatform.setxy(xy[0],xy[1],0);

//gData.mapNumberSet(mapNum[0], mapNum[1], mapNum[2]);
gData.mapNumberSet(mapNum[0], mapNum[1]);
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}


}

ロードはセーブと手順が逆になる。
propertiesを読み込み、そこから各ファイルを引きずり出すイメージ。
ファイル名の指定がめんどくさいが、セーブの手順から左右の変数を入れ替えるだけ。
機械的に処理できるだろう…。

ロード完了してstatuswindowクラスを抜けたら、dataLoadFlagを立てる。
この状態でEventExeクラスに戻ったらマップ読み込みイベントに突入させる。

[EventExecutionクラスの一部]
public void sWinEventStart() {

sWin.eventStart(gData);
//終了フラグが送られてきたらイベントフェーズを進める。
if (sWin.stWinEnd) {
//データロード処理を経て終了した場合、マップの再読み込み等を行う。
//System.out.println("sWin.dataLoadFlag="+sWin.dataLoadFlag);
phasePlus++;
if (sWin.dataLoadFlag) { //ロードして抜けたケース
//mapDataLoad();
int[] data=new int[7];
int[] pxy=gData.pPlatform.getxy();

data[0]=1;
data[1]=gData.mapNumber[0];
data[2]=gData.mapNumber[1];
data[3]=gData.mapNumber[2];
data[4]=pxy[0]/32; //実座標で入っているので、32区切りに変換する。
data[5]=pxy[1]/32;
data[6]=pxy[2];
//あとは通常のマップ移動イベントを利用。
//System.out.println("gp mapNumber="+gp[2]+","+gp[3]+" x y="+gp[4]+","+gp[5]+" shift="+gp[6]);
mapMoveDataSet(data);
//phasePlus++;
}
}


}

dataにマップ、x,y,shiftを入れて場所移動イベントを強制起動する。
このやり方はタイトル画面からゲーム開始するときも使う。
その場合は座標固定なのでもうちょい手順が短い。

次回はフラグ、所持アイテムをセーブできるようにする。
次の次はユニットのデータと装備品も記憶させる。
そこまでできたらセーブ・ロードは完成。

その次はいよいよマップを作り始める。
いままでは仮マップだったので、正規マップを用意するのだ。
これがクソめんどくさい…。エディタ用意すればもっと楽なんだが、
テストゲームを作り上げてから手を付ける。



・トップページへ戻る
inserted by FC2 system