RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座 028回
ダンジョンマップを作る2 主要イベントを配置


kouza028 jarファイル



[主要なイベントだけ配置]
ゲームとしては何も面白くないが、戦闘も何もないバージョンでシナリオ完成。
これに雑魚的配置とボスを置いて、宝箱増やしたら一丁上がりだがそれは次回。
今回は最低限のフラグ管理、ブロックイベント、終了イベントを作った。
2Fのスイッチをオンにして、1Fのスイッチをオンにして、
別の階段から2Fの最深部に行くと終了イベントをオンにできる。
その状態で拠点に戻るとクリア…だが、クリアイベントは作っていない。
こうやってイベントを作れるんだな、というやり方を説明する。
ポイントはGameDataクラスのイベント配置処理に詰まっている。

[GameDataクラス、obj配置クラス objKariSet]
public void objKariSet(int mnum,int fnum) {

//--中略--

if (mnum==2) {
objKariSet3(12,18,0,0,5,0,0,1,7,14,2);
objKariSet3(13,18,0,0,5,0,0,1,7,14,2);
objKariSet2(4,2,0,5,7,2,0); //武器屋
objKariSet2(4,4,0,5,7,3,0); //防具
objKariSet2(4,7,0,5,7,4,0); //装具
objKariSet2(4,9,0,5,7,5,0); //道具
if (eventFlag[3][2]==0) {
objKariSet2(4,13,0,5,1,6,0); //目的を説明する会話文
} else {
objKariSet2(4,13,0,5,1,9,0); //シナリオ終了イベントを立ち上げる
}
objKariSet2(3,2,6,2,1,5,6); //店員風のオブジェ。実際はカウンターが売買のトリガー。
objKariSet2(3,4,6,2,1,5,6);
objKariSet2(3,7,6,2,1,5,6);
objKariSet2(3,9,6,2,1,5,6);
objKariSet2(3,13,6,2,1,6,6); //目的を説明する会話文
objKariSet2(23,15,0,0,4,0,0); //回復魔法陣
objKariSet3(24,8,0,0,5,0,3,1,1,25,6);
objKariSet3(24,9,0,0,5,0,3,1,1,26,6);
}
if (mnum==3) {
if (fnum==1) {
objKariSet3(0,25,0,0,5,0,2,1,23,8,4);
objKariSet3(0,26,0,0,5,0,2,1,23,9,4);
objKariSet3(1,2,0,7,5,0,3,2,2,2,6);
objKariSet3(14,11,0,7,5,0,3,2,13,11,4);
objKariSet4(29,21,0,9,0,1,3,0); //フラグ3-0が0の間はブロックを出して邪魔する。
objKariSet3(24,21,0,10,8,3,1,1,7,0,0); //フラグ3-1を1にする メッセージは7番目
objKariSet5(1,11,0,3,9,1,1,3,0,1);
}
if (fnum==2) {
objKariSet3(1,2,0,8,5,0,3,1,2,2,6);
objKariSet3(14,11,0,8,5,0,3,1,14,12,2);
objKariSet4(29,21,0,9,0,1,3,1); //フラグ3-1が0の間はブロックを出して邪魔する。
objKariSet3(6,10,0,10,8,3,0,1,7,0,0); //フラグ3-0を1にする
objKariSet5(1,22,0,3,10,3,2,3,2,2); //フラグ3-2を1にする
}
}


}

mnum==2のここの処理が苦しいが、代用の方法を思いつかないので強引にフラグで分岐させた。
本当はこういう処理入れ替えも全てセットの方でやるのが理想。
コードをいじって分岐させるのは下策だが、ここでしか使わないので妥協した。

if (eventFlag[3][2]==0) {
objKariSet2(4,13,0,5,1,6,0); //目的を説明する会話文
} else {
objKariSet2(4,13,0,5,1,9,0); //シナリオ終了イベントを立ち上げる
}

(fnum==1)
objKariSet4(29,21,0,9,0,1,3,0); //フラグ3-0が0の間はブロックを出して邪魔する。

この処理は、フラグ[3][0]が立たないとブロックを表示し続ける。
イベントナンバーは0なので触っても何も起きないイベント。
しかしブロックは行われるので通過できない。

objKariSet5(1,11,0,3,9,1,1,3,0,1);

要素が多く理解しづらいが、将来的に手入力ではなくエディタで打ち込む形にする予定。
3がグラナンバー、9は宝イベントのナンバー。1,1,3,0,1が要素。
・1,1はアイテムカテゴリーとナンバー。
・3,0は立てるフラグ。アイテム取得後これが1になる。
・最後の1は判定用の番号。1の場合は宝フラグを基準にする。
treasureFlag[3][0]==1の場合は、既に宝を取ったとみなし、今後イベントをセットしない。
ということ。
宝のナンバー、フラグ、最後に1、とセットすると、宝イベントが作れる、と覚える。

(fnum==2)
objKariSet5(1,22,0,3,10,3,2,3,2,2); //フラグ3-2を1にする
これだけ補足がいるか。
1Fでは宝のセットに使っているが、これはそれを変形してフラグ立てるイベントに流用している。
フラグ3-2を立て、3-2がオンなら非表示にする、というだけのイベント。
3,2を二回打ち込むのが無駄だなぁ…しかたないけど。
最後の要素2は、宝の場合と違い、eventFlagを判断の基準にする。
一度フラグを立てたら二度と表示させたくないイベントなので、強制的に消すために使った。

//特殊命令セット。フラグ状態により、消したり出したりする。2とほとんど同じだが、変数の設定が一要素増えている。
public void objKariSet4(int x,int y,int shift,int granum,int evnum,int dt1,int dt2,int dt3) {

ObjectBase obj=new ObjectBase();
Boolean objDelete=false;
if (dt1==1) { //特殊命令。イベントナンバー0の壁イベントの時のみ、特定フラグが立っていたらオブジェ登録しない=存在を消す。
if (eventFlag[dt2][dt3]==1) objDelete=true;
}
if (dt1==2) { //1の逆パターン。イベントフラグが立っている時に表示する。立ってないときは消す。

}
if (objDelete==false) {
obj=odtSet.dataSetEasy(objCount,x*32,y*32,shift,granum,evnum,dt1,dt2); //granumは0で入れると自動的にイベントナンバーに適した絵を当てはめる。
obj.setMapSize(mapSize[0]*32, mapSize[1]*32);
objs.add(obj);
}
objCount++;


} //ほとんど宝専用の処理。上の奴より引数が多く設定要素も多い。
public void objKariSet5(int x,int y,int shift,int granum,int evnum,int dt1,int dt2,int dt3,int dt4,int dt5) {

ObjectBase obj=new ObjectBase();
int[] dt= {dt1,dt2,dt3,dt4,dt5,0};
Boolean objDelete=false;
if (dt5==1) {
if (treasureFlag[dt3][dt4]==1) objDelete=true;
}
if (dt5==2) {
if (eventFlag[dt3][dt4]==1) objDelete=true;
}
if (objDelete==false) {
obj=odtSet.dataSetEasy2(objCount,x*32,y*32,shift,granum,evnum,dt);
obj.setMapSize(mapSize[0]*32, mapSize[1]*32);
objs.add(obj);
}
objCount++;


}

本当はこれだけ細かく分けるなら、treasureSetとかflagSetとか専用の名前を付けた方がいい。
使いまわすのが苦しい処理がおおいので、いっそ固定にした方が打ち込む時に分かりやすくなる。


今回はここまで。フラグの状態はセーブすると保存されるので、
一度取った宝はもう出ないし、スイッチの状態も保持される。

次回は雑魚敵を配置してみる。
今まで作ってなかったが、追いかけてくるイベントを作る。
それだけで結構な量の追加が要ると思う。


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