RPG01

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


RPGkouza2-08 zipファイル


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

[マップエディターはこれでひとまず完成]
オブジェエディターの入り口まで作りたかったが、思ったより大工事になったのでここでカット。
・ボタンの位置を大きく変更し、使用効果も変えた
…前回までの物より使いやすくなったと思う。
・マップナンバー、フロアナンバーの二つのキーで保存可能にした
・マップサイズをエディタ側から指定できるようにした

ボタンを押すとさらにボタンが展開する方式に切り替えたので、誤動作が減ると思う。
今どのボタンを展開しているかを示すために色を変えている。

タイトル画面からエディターへ移行する処理を変更している。
他のエディターもタイトル画面から立ち上げられるように5枠作っておいた。
まずはタイトル画面の変更箇所から見ていく。

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

//PlayerPlatform pPlatform=gdt.pPlatform;
int pushKey=0;
int modeChange=999;
gData=gdt;
if (gData.pPlatform.keyPush[4]) { //space
gData.pPlatform.keyPush[4]=false;
pushKey=1;
gData.sePlay(1);
//sdPlay.sePlay(1);
}
if (gData.pPlatform.keyPush[5]) { //d
gData.pPlatform.keyPush[5]=false;
pushKey=2;
gData.sePlay(2);
//sdPlay.sePlay(2);
}
if (gData.pPlatform.keyPush[0]) { //up
gData.pPlatform.keyPush[0]=false;

cursorPos[mode][0]--;
}
if (gData.pPlatform.keyPush[1]) { //down
gData.pPlatform.keyPush[1]=false;
cursorPos[mode][0]++;
}


if (mode==0) {
if (pushKey==1) {
int cp=cursorPos[0][0];
if (cp==0) {//はじめからスタート
titlePartEnd=true;
}
if (cp==1) {//ロード
modeChange=1;
}
if (cp==2) { //Editor選択モードに切り替える
modeChange=2;
}
}
}
//ロードするファイルを選ぶモード
if (mode==1) {
if (pushKey==1) {
int cp=cursorPos[1][0];
dataLoad();
}
if (pushKey==2) modeChange=0;
}

if (mode==2) {
if (pushKey==1) {
int cp=cursorPos[2][0];
//MapEditorを立ち上げる。
if (cp==0) mapEditorStart=true;
}
if (pushKey==2) modeChange=0;
}

if (modeChange<=10) {
mode=modeChange;
}
if (cursorPos[mode][0] > cursorPos[mode][1]) cursorPos[mode][0]=0;
if (cursorPos[mode][0] < 0) cursorPos[mode][0]=cursorPos[mode][1];


}

modeごとにキーチェックを行う形に変更している。
load以外にモードが増えたので、別個に管理しないと訳が分からなくなるので。
考える単位をモード内部で完結するようにすると理解しやすい。

追加したのはmode2。エディタをセレクトする段階を増やした。
これからオブジェエディタ、ユニットデータを作るエディタ、アイテム、魔法エディタ? などを追加できるようにした。
会話エディタも作りたいが、入力が難しそうなので後回しにする。

paintはLoadを少しいじったのをコピペしただけなので省略する。

[MapEditorクラス]
ボタンの場所入れ替えで座標は変わったが、やってることは同じなので省略。
SaveとLoadの引数が増えたのでそこを見ていく。

public void mapDataSave() {

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


}

public void mapDataLoad() {

maptipNumber=dataSL.mapDataLoad(mapNumber,floorNumber);
mapWidth=dataSL.someData[0];
mapHeight=dataSL.someData[1];
blockNumber=dataSL.blockDataLoad(mapNumber,floorNumber);
infoMesCount=30;
infoMes="FILE"+mapNumber+" をLOADしました";


}

save時にmapNumber,FloorNumberに加え、mapWidth,Heightも渡す。
mapDataのプロパティーにマップ幅をセーブさせるためだ。
それに伴い、LoadでmapWidthなどをロードするのだが、受け渡しに困った。
仕方ないのでグローバル変数を作り、ロード時にそこへ代入、強引に引っ張り出す形にした。
この読み込み処理は通常のロード処理でも必要になる。

[GameDataクラスの一部]
/読み込みテスト用マップ
if (mnum==4) {

maptipNumber=dataSL.mapDataLoad(0,0);
mapSize[0]=dataSL.someData[0];
mapSize[1]=dataSL.someData[1];
blockNumber=dataSL.blockDataLoad(0,0);


}

実際に使用する時の処理。マップ読み込みと同時に縦横幅も変数に入れる。

[MapEditorクラス]
paintの一部。
ボタン押すとメニュー展開する処理を書いておく。
そんなに大層なものではないが。

public void paint(Graphics gr) {

//省略

//マップチップ配置/ブロック配置切り替え
int bcol=0;
String sword="MapTip";
if (setMode==1) {
sword="Block";
bcol=2;
}
int fy=sty+32;
gSet.rectSet2(gr,stx,fy,90,30,bcol,0);

gSet.wordDisp_short2(gr,sword,stx,fy+20,0);
if (setMode==1) {
gSet.rectSet2(gr,stx+90,fy,30,30,1,0);
gSet.rectSet2(gr,stx+120,fy,30,30,1,0);
String word=" 0";
if (selectBlockNumber==0) word="[0]";
gSet.wordDisp_short2(gr,word,stx+90,fy+20,0);
word=" 1";
if (selectBlockNumber==1) word="[1]";
gSet.wordDisp_short2(gr,word,stx+120,fy+20,0);
}
int mspx=608;
int mspy=sty+96;//456
//ファイルナンバー設定
fy=360+64;
int col=0;
if (setMode==2) col=2;
gSet.rectSet2(gr,stx,fy,90,30,col,0);
gSet.wordDisp_short2(gr,"FileSet",stx,fy+20,0);

if (setMode==0) {
gSet.rectSet2(gr,stx+90,fy,100,30,1,0);
gSet.wordDisp_short2(gr,"M"+mapNumber+"-F"+floorNumber,stx+90,fy+20,0);
}
if (setMode==2) {
int fstx=stx+90;
for (int i=0;i<=1;i++) {
int fy2=sty+64+i*32;
String word="M"+mapNumber;
if (i==1) word="F"+floorNumber;
gSet.rectSet2(gr,fstx,fy2,20,30,1,0);
gSet.wordDisp_short2(gr,"▲",fstx,fy2+20,0);
gSet.rectSet2(gr,fstx+20,fy2,20,30,1,0);
gSet.wordDisp_short2(gr,"▼",fstx+20,fy2+20,0);

gSet.rectSet2(gr,fstx+40,fy2,55,30,0,0);
gSet.wordDisp_short2(gr,word,fstx+40,fy2+20,0);
}
}
//マップサイズ変更
String word2="MapSize";
col=0;
if (setMode==3) col=2;
gSet.rectSet2(gr,mspx,mspy,90,30,col,0);
gSet.wordDisp_short2(gr,word2,mspx,mspy+20,0);
if (setMode==0) {
gSet.rectSet2(gr,stx+90,sty+96,100,30,1,0);
gSet.wordDisp_short2(gr,""+mapWidth+"*"+mapHeight,stx+90,sty+96+20,0);
}

if (setMode==3) {
int fstx=stx+90;
for (int i=0;i<=2;i++) {
fy=sty+96+i*32;
String word="W"+mapWidth;
if (i==1) word="H"+mapHeight;
if (i==2) word="+画面";
gSet.rectSet2(gr,fstx,fy,20,30,1,0);
gSet.wordDisp_short2(gr,"▲",fstx,fy+20,0);
gSet.rectSet2(gr,fstx+20,fy,20,30,1,0);
gSet.wordDisp_short2(gr,"▼",fstx+20,fy+20,0);
gSet.rectSet2(gr,fstx+40,fy,55,30,0,0);
gSet.wordDisp_short2(gr,word,fstx+40,fy+20,0);
}
}



//省略
}

同じような処理が三つあるが全部書いておいた。
特定のモード時のみ表示するボタンの展開。
展開する場所が被っているボタンもある。
上下増加の処理は二か所で使いまわしているので、関数でまとめても良かったかも。
そのうちやろう。

setMode3は画面の縦横幅を指定する処理。
それ以上画面をスクロールさせないためにギリギリの地点でセットする。
これをいい加減にすると見えてはいけない部分まで見られてしまう。
ダンジョンの内部なのに草原チップが見えたり…。

+画面ボタンが意味不明かも知れないが、意味があって追加している。
一画面単位で縦横幅を増価させたい時に使う。
細かい調整は手動でやって、おおまかなサイズだけ決めておきたい時に便利だと思って作った。
大体1画面単位でマップも作ると思うので。

今回はここまで。マップエディタはまた何か思いついたら追加する。
次回はオブジェエディタを作り始める。
これもそれほど大したものではなく、視覚的に分かりやすいデータを作るための処理。
GameDataで手打ちするとミスが怖い。
それを減らすため+入力が分かりやすくなる。



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