RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座 025回
セーブ、ロードを作成3 ユニットデータをセーブ


kouza025 jarファイル


[セーブ、ロードを作成3]

ユニットのデータをセーブできるようにした。
装備品も含めている。
アイテムと同じく最低限のデータ、ユニットナンバー、LV、ボーナス値だけ保存している。
ボーナス値ってなによ? と思うだろうが、この段階では使わない。
限界を突破したステータスの補正値、と言う感じ。

通常種族のステータスに従って能力値は決まるので、幾らレベルを上げても限界は見えてくる。
悪魔やドラゴンがちょちょいっとレベルを上げるとあっという間に人間の強さを抜く。
それに抗うための補正値がボーナス値。
種族の固有値に上乗せされるので、1レベル当たりのステータス上昇値がその分上がる。
レベルが高くなる程数補正値も増える。

ディスガイアの新キャラ作るときにボーナスポイントを振り分けするでしょ? アレと同じ。
攻撃力極振り、とかそういう感じのもの。
余程高レベルにならないと反映されないステータスなので、テストゲームでは使わない数値になる。

[DataSaveLoadクラス]
public void unitDataSave(int unitNum,UnitData uData) {
//FILE〇 フォルダに unit○○.propertiesというファイルを作成する。0-9の10キャラ分暫定で保存できるようにした。

try {
String fileName="";
Properties properties = new Properties();

//ステータス各種をどんどんPropertiesにぶち込んでいく。
properties.setProperty("unitNumber", String.valueOf(uData.unitNumber) );
properties.setProperty("name", uData.name);
for (int i=0;i<=2;i++) {
properties.setProperty("lv"+i,String.valueOf(uData.lv[i]) );
properties.setProperty("exp"+i,String.valueOf(uData.exp[i]) );
}
for (int i=0;i<=3;i++) {
properties.setProperty("vst_base_bp"+i,String.valueOf(uData.vst_base_bp[i]) );
properties.setProperty("fst_base_bp"+i,String.valueOf(uData.fst_base_bp[i]) );
properties.setProperty("mst_base_bp"+i,String.valueOf(uData.mst_base_bp[i]) );
//例外として現在のHP,KP,MPは保存する。セーブ・ロードでフル回復しちゃうからね…。
properties.setProperty("vst_total"+i,String.valueOf(uData.vst_total[i]) );
}
//装備している武具のカテゴリー、アイテムナンバーのみセーブする。
//ロード時はそれを元にアイテムデータを作り直す。全データをキープするのはしんどいので最小限に収める。
for (int i=0;i<=5;i++) { //武器12ぼうぐ3装飾45で5枠。
properties.setProperty("eiData"+i+"_category",String.valueOf(uData.eiData[i].category) );
properties.setProperty("eiData"+i+"_itemNumber",String.valueOf(uData.eiData[i].itemNumber) );
}
//術技のナンバーだけセーブする。これを元にロード時に術技を設定し直す。
for (int i=0;i<=19;i++) {
properties.setProperty("masNumber"+i,String.valueOf(uData.masData[i].masNumber) );
}
//ロードでも使うのでファイルネーム読み込みを関数化しておく。
//fileName=unitDataFileNameSet(unitNum);
fileName="SD_"+fileNum+"_unit"+unitNum+".properties";
properties.store(new FileOutputStream(fileName), "Comments");

} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}


}

public UnitData unitDataLoad(int unitNum/*,UnitData uData*/) {

//セーブの逆処理。
UnitData uData=new UnitData();
try {
String fileName="";
Properties properties = new Properties();
UnitDataSet uDataSet=null;
uDataSet=new UnitDataSet();
fileName="SD_"+fileNum+"_unit"+unitNum+".properties";
properties.load(new FileInputStream(fileName) );
//unitNumはあくまで0-9の順に過ぎないので、0番のユニットが何番のユニットか、1番が何番か、というユニット固有の番号を引きずりだす。
int unum=Integer.parseInt(properties.getProperty("unitNumber"));
System.out.println("unum = "+unum);
if (unum>=1) {
//本来はlvなども先読みして、ここで一括セットする。
System.out.println("unit data load set");
int[] lv=new int[3];
int[] exp=new int[3];
for (int i=0;i<=1;i++) {
lv[i]=Integer.parseInt(properties.getProperty("lv"+i) );
exp[i]=Integer.parseInt(properties.getProperty("exp"+i) );
}
uData=uDataSet.dataSet(unum,lv[0],lv[1],0);
//上でデータ作成後に経験値を入れ直す。nextは上記処理でセットするので記憶しない。
for (int i=0;i<=1;i++) {
uData.exp[i]=exp[i];
}
//ボーナスポイントと、vstの現在値をセーブデータから反映させる。セーブ・ロードごとにフル回復されても困るので。
for (int i=0;i<=3;i++) {
uData.vst_base_bp[i]=Integer.parseInt(properties.getProperty("vst_base_bp"+i) );
uData.fst_base_bp[i]=Integer.parseInt(properties.getProperty("fst_base_bp"+i) );
uData.mst_base_bp[i]=Integer.parseInt(properties.getProperty("mst_base_bp"+i) );
uData.vst_total[i]=Integer.parseInt(properties.getProperty("vst_total"+i) );
}
}

ItemDataSet idSet=new ItemDataSet();
for (int i=0;i<=5;i++) {
//装備のカテゴリーとナンバーを読み込む。
int cate=Integer.parseInt(properties.getProperty("eiData"+i+"_category") );
int inum=Integer.parseInt(properties.getProperty("eiData"+i+"_itemNumber") );
//読み込んだ二つのデータをもとにitemdatasetを経由し、アイテムを作り直す。
uData.eiData[i]=idSet.dataSet_easy(cate,inum);
}
//最終的に装備、ボーナス値を含めたデータを再計算する。このままでは素のステしか反映されない。
uData.totalDataSet(0);
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
return uData;


}

少し補足すると、unitdataを作った後にボーナス値、vstの反映をしている。
unitdata作る前にやると、当然初期化されて無駄になる。
同様に装備品のセットも後でやっている。
セーブした物をロードで取り出すため、変数の指定を間違えないこと。
セーブしてないデータをうっかり抜こうとするとエラーが起きる。
要素数が5しかセーブしてないのに6個目を読むとエラーになる。

次はマップ作成してゲームっぽくする。
手打ちで全部入力するとめんどくさいな…エディタ作った方が楽かもしれない。
だが、ここはあえてめんどくさい方法で作る。
その代わりマップを最低限の枚数で仕上げる。



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