RPG01

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


RPGkouza2-06 zipファイル



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

[ブロックデータを保存できるようにした]
ボタンの位置を修正し、その他バグ取りもしているので色々変わっている。
大きな変更点は ・ブロックデータの編集機能の追加
・右の枠でボタンを押したときに一回しか反応しないようにした
チップ取得、セーブやロードなどのボタンを押したときに
一回しか反応しないようにしている。
マップチップ配置やブロック配置の時は従来どおり
押しっぱなしでも反応するようにしている。

MTIP,■BLC というボタンをクリックすると
マップチップ配置 / ブロック配置にモードが切り替わる。
BLCモードの時はさらに右側にブロック状態取得ボタンを表示する。
0 空白 / 1 壁 を切り替えて左のマップに配置するわけだ。
将来的には高さの概念を取り入れたいが、今回は壁かそうでないかだけを入力する。
一気に色々やろうとするとまず破綻するので、簡単な物から作っていく。
まだまともなゲームの形には程遠いので…。

今回の追加部分。既存の部分もいじったのでかなり長くなるかも。

[MapEditor クラス]
public void eventStart(GameData gdt) {

gData=gdt;
int pushKey=0;
int cPlus=0;
mouseX=gData.pPlatform.mouseEvDragged[1];
mouseY=gData.pPlatform.mouseEvDragged[2];
click=gData.pPlatform.mouseEvDragged[0];
mouseCX=gData.pPlatform.mouseEv[1];
mouseCY=gData.pPlatform.mouseEv[2];
releaseC=gData.pPlatform.mouseEv[3];
clickC=gData.pPlatform.mouseEv[0];
if (releaseC==1 && mouseClicked==1) {
System.out.println("mouseRelease sitayo");
mouseClicked=0;
}
gData=gdt;
まずここで一回解説を入れる。
rgData.pPlatform.mouseEv[3]; =releaseCというのはARPanelで新規に追加した要素。
マウスから手を離したときのみ1が入る様にしている。
mouseClickedというのは右枠のボタンのどれかを押したときに1になる変数。
リリースするまでこれが1で保持され、これが1の間はボタン操作を受け付けない。
そこら辺の処理はこれから出てくる。

//省略
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;
if (setMode==0) maptipNumber[nmx+nowmx][nmy+nowmy]=nowChip;
if (setMode==1) blockNumber[nmx+nowmx][nmy+nowmy]=selectBlockNumber;
}
//マップのスクロール
if (buttonCheck(576,0,32,288)) nowmy--;
if (buttonCheck(576,288,32,288)) nowmy++;;
if (nowmy<=0) nowmy=0;
if (nowmy>=myMax-17) nowmy=myMax-17;
if (buttonCheck(0,576,288,32)) nowmx--;

if (buttonCheck(288,576,288,32)) nowmx++;;
if (nowmx<=0) nowmx=0;
if (nowmx>=mxMax-17) nowmx=mxMax-17;

//チップ取得フィールドのスクロール
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 (clickC==1 && mouseClicked==0) {
mouseClicked=1;
//clickC=0;
//チップ取得フィールドでボタンを押したケース
if (buttonCheck(608,0,160,320)) {
int nmx=(mouseX-608)/32+nowcx;
int nmy=mouseY/32+nowcy;
nowChip=pick_maptipNumber[nmx][nmy];
}
int stx=608;
int sty=360;
if (buttonCheck(stx,sty,60,30) ) mEditEnd=true; //終了ボタン
if (buttonCheck(stx+60,sty,60,30) ) mapDataSave(); //セーブボタン
if (buttonCheck(stx+120,sty,60,30) ) mapDataLoad(); //ロードボタン
if (buttonCheck(stx,sty+32,30,30) ) fileNumber--;
if (buttonCheck(stx+60,sty+32,30,30) ) fileNumber++;
if (buttonCheck(stx,sty+64,60,30) ) {
if (setMode==0) {
setMode=1;
} else {
setMode=0;
}
}
if (setMode==1) {
if (buttonCheck(stx+60,sty+64,60,30) ) selectBlockNumber=0;
if (buttonCheck(stx+90,sty+64,60,30) ) selectBlockNumber=1;
}
if (fileNumber<=0) fileNumber=0;
}
break;
}


}

大分処理の順番を入れ替えた。
if (clickC==1) {
の枠内は、従来通りにドラッグしたままチップを配置できる処理を入れている。
左のマップへ配置する処理と、スクロール処理。

if (clickC==1 && mouseClicked==0) {
mouseClicked=1;
この先の処理は右枠のチップ取得とセーブやロードなどのボタン。
連打されると不都合な処理をまとめている。
ここでどれかのボタンをクリックしたらmouseClicked変数を1にして、
リリースされるまで無反応になる。

ボタンの位置を全体的に上にスライドした。
さらにブロック配置用のボタン処理を後半に追加している。
やっていることは簡単なのでその場で変数をいじって即実行。関数に回すまでも無い。

少し戻ってマップのクリック時の処理。
if (setMode==0) maptipNumber[nmx+nowmx][nmy+nowmy]=nowChip;
if (setMode==1) blockNumber[nmx+nowmx][nmy+nowmy]=selectBlockNumber;

setMode==1の時に左のマップをクリックするとマップチップではなくブロックを置き換える。
ブロックありか無しかの2択なのでシンプル。
本当はマップチップにブロック属性をくみこんでもよかったのだが、あえて分けた。

次はセーブ、ロードの変更点。
マップチップの状態だけでなく、ブロックの配置状態もセーブ/ロードする処理を追加する。



public void mapDataSave() {

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


}

public void mapDataLoad() {

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


}

saveは
dataSL.blockDataSave(fileNumber,blockNumber);

Loadは
blockNumber=dataSL.blockDataLoad(fileNumber);

これが追加した部分。
セーブ時は引数としてblockNumberを渡す。
ロード時は受け取るデータがblockNumber。
そこが違うだけでやることはマップチップの時とそう変わりはない。

Save、Load処理も一応コピペしておく。


[DataSaveLoadクラス]
public void blockDataSave(int fileNum, int[][] blockNumber) {

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

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


}

セーブに関してあまり補足することはないが、扱うデータがintなのがポイント。
ロード時に文字列を再びint型に戻さないとデータとして使えない。

public int[][] blockDataLoad(int fileNum) {

int[][] blockNumber=null;
blockNumber=new int[101][101];
for (int i=0;i<=100;i++) {
for (int j=0;j<=100;j++) {
blockNumber[i][j]=0;
}
}

try {
Properties properties = new Properties();
String fileName="";
fileName="BLOCK"+fileNum+".properties";
properties.load(new FileInputStream(fileName) );
for (int y=0;y<=99;y++) {
String line=properties.getProperty("blNum"+y);
String[] spstr=new String[100];
spstr=line.split(",",0);
for (int x=0;x<=99;x++) {
blockNumber[x][y]=Integer.parseInt(spstr[x]);
}
}

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


}

blockNumber[x][y]=Integer.parseInt(spstr[x]);
ここで文字列型をint型に変換。
ファイル名が"BLOCK_.properties"なこと以外は大体マップの物をそのまま使いまわしている。

これでブロックデータも連動してセーブ・ロードできるようになった。

次回は予告通りゲーム内でエディタで作成したマップを呼び出してみる。
うまく行ったら全部のマップをエディタで作ったものと差し替える。


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