RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座 032回
ボスを作る (固定パターンの敵作成)


kouza032 jarファイル



[固定パターンの敵作成]
分けるほどの内容じゃないけど、終わりも近いので丁寧にいく。
今まではランダム作成の敵出現だけを作っていたが、今回は何度エンカウントしても同じ敵をだす処理を作った。
早速処理を見て行く。メインはGameDataクラス。

[GameDataクラス]
//仮データを打ち込み、マップ表示テストを行う。適当な座標に一体出してみる。
public void objKariSet(int mnum,int fnum) {
中略

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);
mapEnemySet1(19,29,0,11,6,0,1,0,2);
中略
mapEnemySet1(18,14,0,11,6,1,0,0,2);
}
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の間はブロックを出して邪魔する。
mapEnemySet1(15,29,0,11,6,0,1,0,2); //ボス 画面切り替えで何度でも復活する…
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にする
}


以下略
}

本来は2Fのボスだけ作ればいいのだが、1Fにも同じイベントを配置している。
理由はゲームバランスをチェックするため。
ボス戦のテストをするのに毎回毎回スイッチオンにしてその場所まで行くのはだるすぎる。
実戦で調整してくのが一番なので、仮イベントとして配置した。
バランスが取れたらこっちは削除する。

通常のマップ敵とどこが違うのか?
移動させない事と、敵の呼び出しに固定ナンバーを配置している事。
6,1,0,0,2
と通常設定しているところを、
6,0,1,0,2
にしている。

public void mapEnemySet1(int x,int y,int shift,int granum,int evnum,int moveType,int dt1,int dt2,int dt3) {

6(evnumに該当)は戦闘イベント。
次の要素はmovetype。ボスが歩き回ったら戦闘を回避できてしまうので、0にしている。
その次の要素はdt1。これが0ならランダムに敵を作る。ボスは毎度固定なので1を設定した。
1以上が入っていると番号に対応した敵パターンを固定で呼び出す。
dt2はレベル。dt3はデスルーラの移動先。この二つは雑魚敵でもボスでも同じ。

あとは敵データの追加部分を少し見て行く。

[BattlePartクラス]
一部は手を加えずそのままだが、全部コピペした。
//dt1 ランダムor固定敵パターン dt2敵のレベル ランダムの場合は、マップナンバーを元に敵の種類が決まる
public void dataSet(GameData gdt,int dt1, int dt2) {

gData=gdt;
g=gData.g;
init();
for (int i=0;i<=3;i++) {
if(gData.unitLiveCheck(i)==true) {
buData[i]=gData.uData[i];
unitDataSet(i,i);
charaName[i]=buData[i].name;
}
}
//unitBadStatus[0][0]=100; //毒テスト
//unitBadStatus[0][1]=100; //麻痺テスト
//unitBadStatus[0][2]=100; //魔封テスト
//unitBadStatus[0][3]=100; //技封テスト
int enemyCount=2; //5割くらいは一体で出る。
if (dt1==0) { //ランダム敵の場合は出現数が可変。1-3
//敵データを作る。試しに一体。
int yct=0;
for (int i=0;i<=enemyCount-1;i++) {
int en=i+10;
//int[] kd=enemyDataMake(dt1,dt2);
int[] kd=new int[5];
//ホントはフロアも参照するが、今回はマップナンバーだけで敵を読み込む

int mnum=gData.mapNumber[0];
int ran=gData.randMake(2); //よく使う処理なのでよく使うクラスに作っておいた
int enmb=11;
if (ran==2) enmb=12;
int[] kd2= {enmb,dt2,dt2,0};
kd=kd2;

System.out.println("kd=="+kd[0]+","+kd[1]+","+kd[2]+","+kd[3]+",");
buData[en]=uDataSet.dataSet(kd[0],kd[1],kd[2],kd[3]);
unitDataSet(en,yct);
yct++;
if (yct>=4) yct=0; //前列セット終わったらyリセットして後列のセットに入る
charaName[en]=buData[en].name; //敵の名前もキープしておく。各所で使うので、buDataから引っ張るより使いやすい。
}
}
//固定敵設定。
if (dt1==1) {
int en=10;
int enmb=13;
int yct=0;
enemyCount=1;
int[] kd= {enmb,dt2,dt2,2}; //ボス補正の変数を2にする。1は強すぎて1vs1では相当レベルが要る。
buData[en]=uDataSet.dataSet(kd[0],kd[1],kd[2],kd[3]);
unitDataSet(en,yct);
charaName[en]=buData[en].name; //敵の名前もキープしておく。各所で使うので、buDataから引っ張るより使いやすい。
}

//背景マップを設定する。mapNumberを使う。
battleBackNum=1;
if (gData.mapNumber[0]==3) {
battleBackNum=2;
}
battleBackGra=graSet.battleBackGraSet(battleBackNum);


}

大きく手を加えたのはdt1==0 : ランダム敵呼び出し dt1==1: 固定敵呼び出し
の二つに大きく分けた事。dt1==0のパターンはそのままなので省略。
dt1==1のケースが今回のボス敵呼び出し処理。
敵のナンバーは13の豚鬼を指定。(もうちょっと強そうなのでもよかったが、有りものを使った)
レベルは固定じゃないのでGameDataでセットするときに上げ下げ可能。
キモはこの処理。
int[] kd= {enmb,dt2,dt2,2}; //ボス補正の変数を2にする。1は強すぎて1vs1では相当レベルが要る。
一番最後の要素を2にすることで、通常の豚鬼よりも強いデータを上乗せしている。
いわゆるボス補正。即死しなかったりバステが通りにくかったり色々設定できる。
同じ姿の雑魚として出る時よりも強くなるわけだ。
今回はステータスが上積みされる事だけしかいじっていない。
ではその補正値を見て行く。

[UnitDataSetクラス]
public UnitData raceSet(int race,int statusBP) {
中略
if (statusBP>=1) {

//補正値。ベース値に加算する。つまり、上昇値もこの分アップし、上限も上がる。
if (statusBP==1) {
int[] upType= {100,30,30,20,14,10,7,20,14,10,7};
statusUp=upType;
}
if (statusBP==2) {
int[] upType= {50,5,5,2,2,2,1,0,0,0,0};
statusUp=upType;
}


}

色々経て先ほど2を設定した数値はここで使われる。
statusBP(ボーナスポイント)が2の場合、基礎ステータスがこれだけ上積みされる。
HP多め、物理ステータスがやや加算される。
このくらいレベルが上がってきたら大した補正にならないと思うが、
「この数値を足したベース値/4がレベルごとに加算される」
レベルが高くなる程補正値が強くなるのと同じ。
今んとこあまり違いは感じないけど。

今回の処理はここまで。丁寧に抜きしたら割と長くなった。
終わりは近い気がする。
次はタイトル画面を作る。
タイトルを作るとゲームのスタート画面が今までいきなりフィールドだったものが
タイトル画面からスタートする形に切り替わる。
どうやって割り込ませるのかを次は解説していく。


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