RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座2 05回
マップエディター作成5


RPGkouza2-05 zipファイル



[起動方法]
1. Java Runtime Environmentをインストールする。 http://java.com/ja/download/
2.ファイルを適当な場所で解凍する。
3.コマンドプロンプトのアイコンが入っているので起動。
4.j 一文字だけ入力して「Enter」。
これでゲームが始まるはずです。

[編集したマップを保存できるようにした]
チップ取得にバグがあったのでそれも修正した。
この段階では直ってないが、次回の更新で修正している。

//チップ取得フィールドでボタンを押したケース
if (buttonCheck(608,0,160,320)) {
//本来はチップ取得してから任意のチップを入力できるのだが、今回はテスト用に強制的に01を打ち込む。
int nmx=(mouseX-608)/32+nowcx;
int nmy=mouseY/32+nowcy;
nowChip=pick_maptipNumber[nmx+nowmx][nmy+nowmy];//この行が誤り。
}

//修正版
nowChip=pick_maptipNumber[nmx][nmy];//正しくはこちら。

セーブ、ロードに加えて複数マップを保存できるようにした。
操作性最悪なのでもうちょいいいやり方を考える…。
無機質な数字を打ち込むよりはずっとマシだが、
もうちょい取得フィールドが広くないと不便すぎる。
数字の増減が押しっぱなしで動いてしまう欠点があるが、
そこら辺の修正はあとでやる。

今回の追加部分。
[MapEditor クラス]
public void eventStart(GameData gdt) {

case 1://総合メニュー
if (pushKey==1) {

}
if (pushKey==2) {
mEditEnd=true;
}

if (clickC==1) {
//マップチップ配置フィールドでボタンを押したケース
if (buttonCheck(0,0,544,544)) {
//本来はチップ取得してから任意のチップを入力できるのだが、今回はテスト用に強制的に01を打ち込む。
int nmx=mouseX/32;
int nmy=mouseY/32;
maptipNumber[nmx+nowmx][nmy+nowmy]=nowChip; }
//マップのスクロール if (buttonCheck(576,0,32,288)) nowmy--;
if (buttonCheck(576,288,32,288)) nowmy++;;
if (nowmy<=0) nowmy=0;
if (nowmy>=82) nowmy=82;
if (buttonCheck(0,576,288,32)) nowmx--;
if (buttonCheck(288,576,288,32)) nowmx++;;
if (nowmx<=0) nowmx=0;
if (nowmx>=82) nowmx=82;
//チップ取得フィールドでボタンを押したケース
if (buttonCheck(608,0,160,320)) {
//本来はチップ取得してから任意のチップを入力できるのだが、今回はテスト用に強制的に01を打ち込む。
int nmx=(mouseX-608)/32+nowcx;
int nmy=mouseY/32+nowcy;
nowChip=pick_maptipNumber[nmx+nowmx][nmy+nowmy];
}
//チップ取得フィールドのスクロール
if (buttonCheck(768,0,32,160)) nowcy--;
if (buttonCheck(768,160,32,160)) nowcy++;
if (nowcy<=0) nowcy=0;
if (nowcy>=cyMax-10) nowcy=cyMax-10;
if (buttonCheck(608,320,80,32)) nowcx--;
if (buttonCheck(688,320,80,32)) nowcx++;
if (nowcx<=0) nowcx=0;
if (nowcx>=cxMax-4) nowcx=cxMax-4;

if (buttonCheck(600,500,60,30) ) mEditEnd=true; //終了ボタン
if (buttonCheck(660,500,60,30) ) mapDataSave(); //セーブボタン
if (buttonCheck(720,500,60,30) ) mapDataLoad(); //ロードボタン
if (buttonCheck(600,530,30,30) ) fileNumber--;
if (buttonCheck(660,530,30,30) ) fileNumber++;
if (fileNumber<=0) fileNumber=0; }
break;
}


}

if (buttonCheck(600,500,60,30) ) mEditEnd=true; //終了ボタン
…から下の部分が追加部分。

Save, Loadボタンに加えてファイルナンバーを変更するボタンを追加した。
Save, Load 関数を見ていく。…短いけど。

public void mapDataSave() {

dataSL.mapDataSave(fileNumber,maptipNumber);
infoMesCount=30;
infoMes="FILE"+fileNumber+" にSAVEしました";


}

public void mapDataLoad() {

maptipNumber=dataSL.mapDataLoad(fileNumber);
infoMesCount=30;
infoMes="FILE"+fileNumber+" をLOADしました";


}

これだけ。
infoMesが新処理だが、文字通り案内メッセージを一定時間(30カウント)表示する。
paintにこの文を追加している。

if (infoMesCount>=1) {
gSet.wordDisp_short2(g,infoMes,600,580,0);
}

EventStart関数にもこれを追加。

if (infoMesCount>=1) {
infoMesCount--;
}

ループを回すごとにカウンターを減らしている。

話が逸れたが、infoMes処理を除くとたった1行しかない。
処理の大半はSaveLoadクラスで行っている。
Save時は引数として現在選択中のファイルナンバーとマップデータを丸ごと渡している。
Load時は現在のファイルナンバーのみ。
戻り値としてマップデータを丸ごと受け取っている。
データロードして出来上がったマップデータを貰っている、ということ。

具体的なSave、Load処理を見ていく。

[DataSaveLoadクラス]
(mapDataSave関数)
public void mapDataSave(int fileNum, String[][] maptipNumber) {

try {
/*String fileName="";
Properties properties = new Properties();
fileName="MAP"+fileNum+".properties";
for (int y=0;y<=99;y++) {
for (int x=0;x<=99;x++) {
properties.setProperty("mtNum"+x+"-"+y,String.valueOf(maptipNumber[x][y]) );
}
}
properties.store(new FileOutputStream(fileName), "Comments");*/
String fileName="";

Properties properties = new Properties();
fileName="MAP"+fileNum+".properties";
for (int y=0;y<=99;y++) {
String line="";
for (int x=0;x<=99;x++) {
line+=maptipNumber[x][y]+",";
}
properties.setProperty("mtNum"+y,String.valueOf(line) );
}

properties.store(new FileOutputStream(fileName), "Comments");
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}


}

最初の数行をコメントアウトしているが、当初は一行につき1チップのデータをpropertyにいれていた。
このやり方だとかなり容量を食うので、一行ごとに記憶する形に変更。
今度の更新で一個のファイルに全部納める形に変えるかもしれない…。

マップデータを一行単位でまとめて、propertyファイルに書き込んでいる。
ここら辺の処理はステータスのセーブと変わらない。
書き込み先がテキストファイルではなくpropertyファイルなのが少し特殊なだけ。
読み込むときに便利なのでpropertyファイルを多用する。
セーブするときはfileNumに対応したファイルに書き込む。
無数にセーブデータを作れるが、実際に使う時はリネームした方がいいと思う。
エディタでうっかり上書きできてしまうので。

次はここで作ったファイルを読み込むLoad処理。

(mapDataLoad関数)
public String[][] mapDataLoad(int fileNum) {

String[][] maptipNumber=null;
maptipNumber=new String[101][101];
for (int i=0;i<=100;i++) {
for (int j=0;j<=100;j++) {
maptipNumber[i][j]="00";
}
}
try {
String fileName="";
fileName="MAP"+fileNum+".properties";
Properties properties = new Properties();
properties.load(new FileInputStream(fileName) );
fileName="MAP"+fileNum+".properties";
/*for (int y=0;y<=99;y++) {
for (int x=0;x<=99;x++) {
maptipNumber[x][y]=properties.getProperty("mtNum"+x+"-"+y);
}
}*/
for (int y=0;y<=99;y++) {
//String line=properties.getProperty("mtNum"+y,String.valueOf(maptipNumber[x][y]) );
String line=properties.getProperty("mtNum"+y);
String[] spstr=new String[100];
spstr=line.split(",",0);
for (int x=0;x<=99;x++) {
maptipNumber[x][y]=spstr[x];
}
}
properties.store(new FileOutputStream(fileName), "Comments");
return maptipNumber;
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
return maptipNumber;


}

セーブの逆処理なのであまり書くことはないが、一か所だけ補足。

String line=properties.getProperty("mtNum"+y);
String[] spstr=new String[100];
spstr=line.split(",",0);
for (int x=0;x<=99;x++) {
maptipNumber[x][y]=spstr[x];
}

line変数に一行分のマップデータを読み込む。
spstr変数に","単位で分割して格納する。
一文字ずつにきりわけたらmaptipNumberに一個ずつ格納していく。
…という処理。
一行1データの方が扱いは楽なんだが、100*100データ作ると112kbも使う。
たかがそれだけ、と思うかもしれないが、10マップ作れば1120kb。100マップだと11200kbにもなる。
11.2mbってことだ。結構バカにならない。
一行単位にすると35kbくらいに圧縮できる。それでも100行分のデータになるが。

今回はここまで。次回はブロックデータの編集をできるようにする。
マップを見ながらダイレクトにブロックデータを打ち込める。
当たり判定が視覚的に見られるので打ち込みが容易になる。

その次の作業になるが、一度ゲーム内でマップを呼び出してみる。
編集した物が実際に使えるかどうかのテストをするわけだ。
エディタとゲームをリンクさせて初めて使えるデータになる。



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