RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座2 11回
仮マップにオブジェを配置


RPGkouza2-11 zipファイル


[オブジェクトエディター作成3 仮マップにオブジェを配置]
前回作ったものから相当手を加えたので修正してない箇所の方が少ない。
視覚的な部分と、どのイベントでも使う数値を幾つか追加した。
設定する要素が増えて分かりづらくなってしまったが、汎用性を重視した。
では修正箇所を見ていこうと思う。
まずはObjectEditorクラスのペイントから。

[ObjectEditor クラス paint関数]
追加部分だけ抜粋する。

if (mode>=3 && mode<=4 && setType==1) {

//int stx3=stx+200;
int stx3=stx+280;
int sty3=sty+22;
int cy3=sty+cursorPos[3]*22;
gSet.rectSet2_2(gr,stx3,cy3,100,20,0,0);
String[] ostr1= {"X座標","Y座標","方向","画像No.","EventNo.","移動タイプ","条件","条件フラグ1","条件フラグ2","Data1","Data2","Data3","Data4","Data5","Data6"};
String[] setWord=null;
if (keepType==1) { //会話
String[] word= {"会話No.","向き変更"};
setWord=word;
}
if (keepType==2) { //会話(分岐)
String[] word= {"会話No.","選択肢の数"};
setWord=word;
}
if (keepType==3) { //アイテム フラグ無し無条件に無限入手 使わないかも
String[] word= {"アイテム属性","アイテムNo."};
setWord=word;
}
if (keepType==4) { //全回復
String[] word= {"フラッシュ色"};
setWord=word;
}
if (keepType==5 ) { //場所移動
String[] word= {"移動先固定","Map No.","Floor No.","x座標","y座標","向き変更"};
setWord=word;
}
if (keepType==6) { //通常戦闘
String[] word= {"敵種類","敵LV","敗北転移先"};
setWord=word;
}
if (keepType==7) { //ショップ
String[] word= {"店タイプ","店LV"};
setWord=word;
}
if (keepType==8) { //EVフラグ
String[] word= {"フラグ1No.","フラグ2No.","0off/1set","会話No."};
setWord=word;
}
if (keepType==9) { //宝+フラグ この場合は立てるのみ。解除は別枠で。
String[] word= {"アイテム属性","アイテムNo.","フラグ1No.","フラグ2No."};
setWord=word;
}
if (keepType==10) { //目的フラグ シナリオ進行度
String[] word= {"フラグ1No.","フラグ2No.","0off/1set"};
setWord=word;
}
for (int i=0;i<=setWord.length-1;i++) {
ostr1[i+9]=setWord[i];
}
for (int i=0;i<=ostr1.length-1;i++) {
gSet.wordDisp_short2_2(g,ostr1[i],stx3,sty3+i*22-22,0);
gSet.wordDisp_short2_2(g,""+oData[keepObjNumber][i],stx3+100,sty3+i*22-22,0);
}

}

String[] ostr1= {"X座標","Y座標","方向","画像No.","EventNo.","移動タイプ","条件","条件フラグ1","条件フラグ2","Data1","Data2","Data3","Data4","Data5","Data6"};

まずこれ。デフォルトで設定するデータをかなり増やした。
移動タイプ、条件、条件フラグ2つ。
・移動タイプ 0が移動無し、1がプレイヤー追跡。この2つしか作っていない。
・条件 表示条件。
1=特定のイベントフラグがONになると消去されるイベント。
ボス戦、一度だけ起こすイベントなどに設定する。

2=特定のイベントフラグがOFFだと消去されるイベント。
フラグが満たされるまで表示したくないイベントに使う。
特定のボスを倒さないと出ない宝箱や隠しイベントなどに使う。
隠し階段とか隠しボスとか。

3=宝取得フラグがONの場合イベントを消去する。
一度取った宝箱でも画面切り替えると復活してしまうので、
フラグのOnになった宝を2度と出さないようにする。

・条件フラグ1,2 前述の条件により参照するフラグが変化する。
1,2ならeventFlag 3ならtreasureFlagを参照。

使い方が少しややこしいが、イベントを配置しだすと必要な処理なのが分かると思う。
ツクールに普通にある機能なのでツクったことのある人なら使い方に迷わないだろう。
よくできたツールだと改めて思う。パクれる部分が多いし、参考にしている。

if (keepType==1) { //会話
String[] word= {"会話No.","向き変更"};
setWord=word;
}

ここからずらーっとならんでいるのはイベントごとの設定項目を見て分かる形にした物。
Data1は何のデータだったっけ? といちいち覚えてられないので、文字に置き換えている。
会話No.がdata1, 向き変更がdata2に対応している。
イベントごとにこれらのデータの使い方が変わる。(EventExecutionクラスと連動)

ではこれらの設定データを実際のクラスで使う部分を見ていく。


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

//読み込みテスト用マップ
if (mnum==4) {
int[][] oData=dataSL.objDataLoad(0,0);
for (int i=0;i<=99;i++) {
//String[] ostr1= {"X座標","Y座標","方向","画像No.","EventNo.","Data1","Data2","Data3","Data4","Data5","Data6"};
if (oData[i][4]>=1) { //イベントナンバーが0のイベントは無い物として扱う。
objKariSet3_kai(oData[i]);
}
}
}


}

oDataをセーブしたデータから読み込み、そのまま専用の関数にパスする。
objKariSet3_kai というのがこのために作った関数になる。
参照用に通常のobjKariSet3と合わせて書いておく。

//設定データを増やしたパターン。指定要素の多い場所移動イベントに使う。1行き先固定か否か 2mapnum 3floor 4x 5y 6shift
public void objKariSet3(int x,int y,int shift,int granum,int evnum,int dt1,int dt2,int dt3,int dt4,int dt5,int dt6) {

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


}

public void objKariSet3_kai(int[] odt) {

//int x,int y,int shift,int granum,int evnum,int dt1,int dt2,int dt3,int dt4,int dt5,int dt6
ObjectBase obj=new ObjectBase();

int[] dt= {odt[9],odt[10],odt[11],odt[12],odt[13],odt[14]};
Boolean objDelete=false;
if (odt[6]==1 && eventFlag[odt[7]][odt[8]]==1) objDelete=true; //特殊命令。イベントナンバー0の壁イベントの時のみ、特定フラグが立っていたらオブジェ登録しない=存在を消す。
if (odt[6]==2 && eventFlag[odt[7]][odt[8]]==0) objDelete=true; //特殊命令。フラグが立っていないと消す。フラグが立った時のみ表示する上の反対のイベント。
if (odt[6]==3 && treasureFlag[odt[7]][odt[8]]==1) objDelete=true; //宝フラグが立っていたら宝設定しない。

if (objDelete==false) {
obj=odtSet.dataSetEasy2_kai(objCount,odt[0]*32,odt[1]*32,odt[2],odt[3],odt[4],odt[5],dt);
obj.setMapSize(mapSize[0]*32, mapSize[1]*32);
objs.add(obj);
}
if (objDelete==true) { //イベント削除の時は無効データに差し替える。触っても何も起きない。
obj=odtSet.dataSetEasy2_kai(objCount,odt[0]*32,odt[1]*32,0,0,0,0,dt);
obj.live=false;
obj.setMapSize(mapSize[0]*32, mapSize[1]*32);
objs.add(obj);
}
objCount++;


}

kaiとはいうものの原型がほとんどないくらい変更している。

obj=odtSet.dataSetEasy2_kai(objCount,odt[0]*32,odt[1]*32,odt[2],odt[3],odt[4],odt[5],dt);

ここは、0x,1y,2shift,3granum,4eventnumber,5移動タイプ,各dt を渡している。

フラグ条件などでobjDelete==trueの時は無駄イベントを作成する。
全く機能しないイベントだが、番号がズレるのを防ぐために無効イベントとして配置する。
番号を指定して別のイベントから連動して操作するイベントを将来的に作るので、
その布石としてこういう形にした。

本当は固有の番号を割り振った方がいいんだけどね…。
objCountだけ進ませる方が安全かもしれない。
addしなければ参照することもないし。
次回そっちでやってみるか…。

今回はこんな感じ。テストデータではフラグによるイベントの出し入れをチェックできる状態にしてある。
オブジェを追加したり削除したりすることでどうやってイベントを配置するか分かると思う。

int[][] oData=dataSL.objDataLoad(0,0);

今回はobjData0,0番を強制的に読み込んでいるが、
本来はマップナンバー、フロアナンバーと連動させる。
最終的にすべてのイベントとマップをエディターで作ったデータと差し替える。

今回はここまで。次回は何作ろうか…何も考えてない。
イベントエディターを作るか。
いままでコードに直書きしていたのだが、本来はテキストやエディターで作るべきものだ。

if (evnum==1) { //会話

datablock[0][0]=1;
datablock[0][1]=someData[0]; //オブジェから会話データを取り出す。
datablock[1][0]=14;
datablock[1][1]=someData[1]; //オブジェから変更向きデータを取り出す。
datablock[2][0]=999;


}

これらのデータをエディターで打ち込めるようにする。
すぐ思いつく問題点として、
「someDataはどこから引っ張ってくるの?」という疑問が思いつく。
objから読み込まないと判明しないデータなので、エディターの時点で分かるわけがない。
解決方法としては、ひとまず0にしてしまう。
そして、evnum==1を読み込んだ時点で、
datablock[0][1]=someData[0];
datablock[1][1]=someData[1];
と、打ち込むわけだ。
かなり苦しいやり方だが。

エディターの時点ではイベントのおおまかな部分だけ設定し、
objから読み込んだ時点で細かいデータを設定し直す、という方法でクリアするわけ。
そうしないと会話イベントだけで人数分の会話イベントを設定しなければならなくなるし、
店も同様。
けどなぁ…結局どの位置にデータを差し込むか把握しておかないといけないので、
エディターで全て作るというやり方からほど遠い。
コードに直接書く方が楽じゃね? と言う気もする…。

うーん…先にアイテムエディター作るか。
そっちは確実にいるの分かっているし。
アイテム終わったらユニットエディターね。
敵やプレイヤーの初期データを設定する。
レベルによる修正を抜きにしたデータをエディターからセットできるようにする。
この二つを作っている間にイベントエディターが要るかどうか考えよう。



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