ボスを作ってみましょう(いろんな当たり判定編)

今回はJavascriptを使ってオリジナルのボスを作るためのポイントを
配布されているサンプルプログラムを例にして見ていくことにしましょう。


ボスのパラメータを設定する

ゲーム開始時にボスのパラメータを設定しましょう。
このパラメータはゲーム開始時に一度だけ呼び出される関数init()か、
関数userGameStartJS()内に記述しましょう


最低限必要なパラメータは?

ボスの座標、ボスの状態を表す変数、ボスのHPを表す変数です。
サンプルボス1より


ボスの座標を決める

サンプルプログラムでは、ボスのx座標を表す変数をboss_xとし、y座標をboss_yとしています。
座標はブロック単位では無く、1ドット単位で指定します。
1ドット単位毎の座標についてはgetMyXReal()メソッドや、getMyYReal()メソッドで得られる値と同じです。


ボスの状態を表す変数

サンプルプログラムではboss_jyoutaiという変数で指定しています。
この値によってボスの状態が決まっているのかというとそうではありません。
例えばboss_jyoutai=50の時はボスが必ず死んだ状態を指定しているということではないということです。
この値は自分で勝手に決めることができ、ゲーム中の様々な状況を数字で示しただけのものです。


ボスのHP

サンプルプログラムではboss_hpという変数で指定しています。
boss_hp_maxはボスの最大HPを決める変数としています。
ある状態になったときにHPの値を減らす処理を施し、この値を減らします。
この値が0になったからといってボスが死ぬわけではありません。
なぜかと言えば、boss_hpは単なる変数なので、実際にボスのHPを表している数字ではありません
なのでこれが負の値(-1とか-2)になろうがボス自体には何にも影響しません。
この変数がある条件を満たしたときの処理を施すことではじめて、この変数が役割を持つことになります。


スクロールロック

オリジナルボスはグラーダやカイオールといったあらかじめ用意されているボスとは違い、
ボス戦になったときに自動的にスクロールロックをしてくれません。
そこでスクロールロックをするのに必要なメソッドが用意されています。 そのメソッドがsetScrollLock()メソッドです。


もう一度setScrollLock()メソッドを確認しましょう

このメソッドは()内に指定の座標を記述しておくと、その座標が画面左端にきたときに
その座標からスクロールを行わないようにするメソッドです。


ボスの当たり判定

オリジナルボスには当たり判定というのはそもそも存在しません。
というのも、オリジナルボスは単純に画像を表示しただけのものなので、その画像には当たり判定などついているはずがありません。
画像に当たり判定をつけるには、正男の位置と最初に記述したボスの座標で決めなければなりません。


まさおとボスとの当たり判定を決める

プレイヤーが正男を動かせば、まさおの現在位置を示す座標は変わります。
この座標を取得するにはgetMyXReal()メソッドやgetMyYReal()メソッドを使います。
まさおが指定の座標内に入ったときにsetMyMiss()メソッドでまさおを死亡させるか、
setMyHPDamage()メソッドでまさおにダメージを与えるかの処理を施してください。
まさおが指定の座標に入ったかどうかを判定するためにif文を使って条件を指定します。
例えば

if(Applet1.getMyXReal() > boss_x-32  &&  Applet1.getMyXReal() < boss_x+64) {
	if(Applet1.getMyYReal() > boss_y-32  &&  Applet1.getMyYReal() < boss_y+64) {
		//  主人公死亡
		Applet1.setMyMiss(2);
	}
}
のように記述したとします。
if文の中にif文を記述(ネストと言います。)し、1つめのif文にはまさおのx座標とボスのx座標の大小関係を記述しています。
まさおが上の条件を満たした上でさらに次のif文の条件を満たしたときに、setMyMiss()メソッドでまさおを死亡させる処理を施しています。
条件文を詳しく見ていくことにします。
まず、Applet1.getMyXReal() > boss_x-32 の部分ですが、「まさおの現在の位置がボスのx座標から32ドット分前の位置より大きい」ということを示しています。
次に 「&&」 という記述がありますが、これは条件を多重化する時に使うもので意味は「かつ」です。
「○かつ×」は○であって×であるということです。
「||」の意味は「または」で「○または×」は○か×ということです。詳しくは条件分岐の説明で。(未完)
次にApplet1.getMyXReal() < boss_x+64は「まさおの現在位置がボスのx座標から64ドット分後ろより小さい」ことを表し、
このif文の意味は「まさおの現在位置がボスのx座標より32ドット分前からボスのx座標より64ドット分後ろの間にいる。」という条件となり、
これを満たすとき{}内の処理に移行します。
またif文の処理を行い、上の条件2つを満たせば、まさおが死亡する処理を行うことができます。


赤:if文1 青:if文2 紫:当たり判定


注意:ボスとの当たり判定によってダメージを与えた場合、まさおのHPが0となっても死にません。
   よってダメージを与える処理の場合はgetMyHP()メソッドを使ってHPが0以下になった場合、
   まさおを死亡させる処理を記述してください。


ファイアーボールやしっぽ攻撃の当たり判定をつけよう

オリジナルのボスを座標に配置し、ボスとまさおの当たり判定をつけるところまではできましたか?
次にファイアーボールやしっぽ攻撃の当たり判定を作ります。
この当たり判定はボスとまさおの当たり判定のようなif文によるものでは無く、メソッドで作成できます。
ファイアーボールはattackFire()メソッド、しっぽはattackTail()メソッドです。
この2つのメソッドの働きについては第4回のFXで追加されたメソッドを参照してください。こちら
座標と幅、高さを記述すれば、当たり判定の作成は完了です。


ファイアーボールやしっぽが当たったときの処理を記述しましょう。

当たり判定を作ったとしても、当たった場合の処理を施さなければ全く意味がありません。
attackFire()メソッドやattackTail()メソッドは攻撃が当たった場合に数字の1を返します。
サンプルプログラムで「atari = attackFire(…);」と記述しているのは、
変数atariに1を代入するためです。
この変数を利用してさまざまな処理を施しましょう。


ボスを踏む判定をつけよう

やっぱりまさおは敵を踏んで倒すのが一番。
と言うことでボスを踏む処理を記述しましょう。
この処理を記述する場所はボスとまさおの当たり判定のところです。
なぜそこに記述するのかと言うと、ボスを踏むということはボスに接触するということです。
でもこのままの状態では上から踏もうとしてもまさおが死んだり、ダメージを受けてしまいます。
そこで利用するメソッドがgetMyVY()メソッドです。
このメソッドはまさおのY方向の速度を取得するメソッドです。
この値が10より大きければ、まさおは落下している状態です。この状態でボスに接触したときには
まさおにダメージを与えず、ボスにダメージを与えるようにします。
ボスを踏んづけたということでsetMyPress()メソッドを使ってまさおに踏みつけアクションを実行させます。
またまさおの位置をsetMyYReal()メソッドを使って、少しずらしてあげましょう。
サンプルプログラムには潰れカウンターとしてboss_tcという変数を用意しています。
この潰れカウンターの値を利用することで潰れカウンターの値が一定数値を超えている場合は当たり判定を消すという
処理を施すことができます。実際には当たり判定を指定している条件文を読ませないようにします。
潰れカウンターが一定数値以上の時に他の画像を描画することもできます。このときに潰れたボスの画像を描画するのが普通です。


踏み判定のプログラム

潰れカウンターの値を条件としてプログラムを記述しています。
潰れカウンターが0より大きい時の記述にはボスとまさおの当たり判定は存在しません。
0以下の時にはボスとまさおの当たり判定を作っています。
こうすることで踏んだ時に当たり判定内にまさおがいてもダメージを受けないようにすることができます。
潰れカウンターはinit()関数かuserGameStartJS()関数内に記述しておいてください。


最後に

オリジナルのボスを作る基本は以上です。
実際のところオリジナルボスは条件分岐と単純なメソッドだけで作ることができます。
ただし、オリジナルの攻撃を作ろうとすると、いろいろ考えなければなりません。
敵コードを呼び出す攻撃方法だけでも十分です。
自分で実際に弄ってボスを作ることでより理解が深まるはずです。