RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座2 10回
セーブ・ロード実行


RPGkouza2-10 zipファイル


[オブジェクトエディター作成2 セーブ・ロード実行]
マップエディターでやった処理なのでほぼ同じ。
oDataを編集した後にセーブするとその状態をセーブ/ロードできる。
セーブファイルはmapNuber, floorNumber単位で作る。
ここら辺もマップエディターと共通している。
これを実際のマップで使うところまで作りたかったが、
ひとまずこの段階で区切ってみた。

[ObjectEditor クラス]
追加部分だけ抜粋する。クリック関連の処理だけ大きく変更した。

import java.awt.Graphics;

public class ObjectEditor {

public Graphics g;
//省略

public void setNumberInit(int max,int type,int kmode) {
setNumber=new int[11];
for (int i=0;i<=10;i++) {
setNumber[i]=0;
}
setNumber_max=max;
setType=type;
keepMode=kmode;
}

public void eventStart(GameData gdt) {
//省略
case 4: //数値入力モード
if (pushKey==1 || pushKey==6) {
String word="";
for (int i=0;i<=setNumber_max-1;i++) {
word+=setNumber[i];
}
int result=Integer.parseInt(word);
if (setType==1) oData[keepObjNumber][keepNum]=result;
if (setType==2) mapNumber=result;
if (setType==3) floorNumber=result;
modeChange=keepMode; //入力後は一個前に戻す。

}
if (pushKey==7) {
int[] setNumber2=new int[11];
for (int i=0;i<=10;i++) {
setNumber2[i]=0;
}
for (int i=1;i<=setNumber_max-1;i++) {
setNumber2[i]=setNumber[i-1];
}
setNumber=setNumber2;
}

if (pushKey>=10 && pushKey<=19) {
if (setNumber[0]==0) {
for (int i=0;i<=setNumber_max-2;i++) {
setNumber[i]=setNumber[i+1];
}
setNumber[setNumber_max-1]=pushKey-10;
}
}
if (pushKey==2) {
modeChange=keepMode;
}
break;
}

if (clickC==1) {
if (buttonCheck(20,0,60,30) ) editEnd=true; //終了ボタン
if (buttonCheck(80,0,60,30) ) { //SAVEボタン
dataSL.objDataSave(mapNumber,floorNumber,oData);

infoMesCount=30;
infoMes="FILE"+mapNumber+" にSAVEしました";
}
if (buttonCheck(140,0,60,30) ) { //LOADボタン
oData=dataSL.objDataLoad(mapNumber,floorNumber);

infoMesCount=30;
infoMes="FILE"+mapNumber+" にSAVEしました";
}
if (buttonCheck(200,0,120,30) ) {
setNumberInit(3,2,1);
modeChange=4;
}
if (buttonCheck(320,0,120,30) ) {
setNumberInit(3,3,1);
modeChange=4;
}
}
if (modeChange>=1) mode=modeChange;
}


//以下略

SAVE,LOADボタンをクリックすると処理を起動する。
mapNumber, floorNumberの入力を今回はテンキーで打ち込めるようにしている。
前回作ったやつを早速使い回しているわけだ。

mode==4を数値テンキー入力にしたので、そこを経由させるようにする。
setNumberInit(int max,int type,int kmode)を使うことで
セットする数値の桁数、入力値を反映する変数タイプ、入力後に戻るモード
以上三つの数値を一括入力できるようにした。
他の箇所でもこのやり方で初期化している。
今後テンキー入力は他のエディタでも多用すると思う。
そのたびに同じ型を使いまわすので、もっと簡略化した方がいい。

int result=Integer.parseInt(word);
if (setType==1) oData[keepObjNumber][keepNum]=result;
if (setType==2) mapNumber=result;
if (setType==3) floorNumber=result;
modeChange=keepMode; //入力後は一個前に戻す。

入力完了後はsetTypeに応じてデータを入れ込む変数が変わる。
元のモードにチェンジする命令を経由してモード終了する。

データ入力の使いまわしはこんな感じ。
dataSaveLoadクラスも見ておくか?
それほど複雑な処理ではないけど…。


[DataSaveLoad クラス]
//objのデータセーブ objEidtorで使用。ロードはgDataからオブジェ読み込む時にも使う。
public void objDataSave(int mapNum,int floorNum, int[][] oData) {

try {
String fileName="";
Properties properties = new Properties();
fileName="OBJ"+mapNum+"-"+floorNum+".properties";
for (int n=0;n<=99;n++) {
String line="";
for (int c=0;c<=15;c++) {
line+=oData[n][c]+",";
}
properties.setProperty("oNum"+n,String.valueOf(line) );
}
properties.store(new FileOutputStream(fileName), "Comments");
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}


}

OBJ*-*というファイルにoNumを延々書きこんでいく。
oNumにはx,y,typeなどのデータを一行にまとめて1オブジェ単位で保存する。
最大100オブジェを1map/floorごとに作れるようにしているが、もっと増やすことも可能。
1000も要らんだろうな、と思って100で仮決めした。
実際にゲーム作り出したら足りんだろうな、と思うけど。

public int[][] objDataLoad(int mapNum,int floorNum) {

int[][] oData=new int[101][16];
for (int i=0;i<=99;i++) {
for (int j=0;j<=15;j++) {
oData[i][j]=0;
}
}
try {
String fileName="";
fileName="OBJ"+mapNum+"-"+floorNum+".properties";
Properties properties = new Properties();
properties.load(new FileInputStream(fileName) );
for (int n=0;n<=99;n++) {
String line=properties.getProperty("oNum"+n);
String[] spstr=new String[100];
spstr=line.split(",",0);
for (int c=0;c<=15;c++) {
oData[n][c]=Integer.parseInt(spstr[c]);
}
}
properties.store(new FileOutputStream(fileName), "Comments");
return oData;
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
return oData;


}

oData[n][c]=Integer.parseInt(spstr[c]);
oDataはint型なので、intに変換しながら代入していく。
それ以外は特に注意点は無いと思う。

今回はここまで。次回はゲーム内部で作ったデータが使えるかテストする。
この方法でオブジェを作れるようになると大体のイベントがエディタで完成する。
本当はマップエディターとリンクさせるとなお良いんだけど。
この座標にイベントを入れる、と言う感じで視覚的にイベントの場所が把握できるから。
おいおい考えていこう。


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