ボスを配置し、そのボスに当たり判定をつけ、さらに動きまでつけることが出来るようになりました。
では最後にボスに攻撃技を仕込みましょう。
setEnemy()メソッドはsetEnemy(x座標,y座標,敵コード)と記述することで
指定した座標に敵を配置することができるメソッドです。
この座標はブロック単位毎の座標です。
敵コードは1〜40あり、16以降からは敵の攻撃のみを配置することができます。
詳しくはこちらをご覧ください。
ボスが静止している場合は固定位置にしても問題ありませんが、
ボスが動く場合、固定の位置に攻撃のみのコードを配置するのは不自然です。
しかし、ボスの座標はドット単位なので、ボスの座標をそのまま利用することはできません。
このドット単位の座標をブロック単位の座標に変換することで解決することができます。
急かすんじゃない!
ドット単位の座標はx座標の左端は0では無く17です。またy座標の最上部は0では無くもっと大きい値です。
「てめぇ…言ってることが違うじゃねぇか」と急かしたくなると思いますが、本当の話です。
サンプルプログラムではこのように記述しています。
nx = Math.floor(boss_x/32)-1; ny = Math.floor(boss_y/32)-10;1ブロック=32ドットなので、ボスの座標を示す変数を32で割り、Math.floor()というjavascriptで用意されている
あとはこの値をうまく使ってsetEnemy()メソッドを使ってどんどん攻撃技を配置しましょう。
それはそうです。このままsetEnemy()メソッドを記述したら関数が呼び出される度にこのメソッドも実行され、
一定時間毎に敵を配置してしまい、どうすることもできません。
これも条件を指定し、ある条件を満たしたときに敵を配置するというようにしてあげればできます。
そこでサンプルプログラムでは射撃カウンターboss_scという変数を使っています。
サンプルプログラムでは、潰れカウンター、射撃カウンター、爆発カウンターなどを使って次の行動に移るための
時間間隔を設定しています。
もともと用意されているものでは無く、自分で定義します。
例えば0.1秒毎に呼び出される関数内で射撃カウンターboss_scの値を関数が呼び出される度に1減らし、
この値が0以下になったときに敵を配置し、射撃カウンターの値を変更します。
例えば射撃カウンターboss_scの値が30だったとします。
この場合、0.1*30=3秒となり、3秒に1回、敵を配置します。
参考までにプログラム例
… … else if(boss_jyoutai == 200) { boss_sc = 30; boss_jyoutai = 300; } else { //boss_jyoutaiの値は300です boss_sc--; if(boss_sc <= 0) { Applet1.setEnemy(nx,ny,16); boss_sc = 30; } … …「…」はそれ以前、以降に書かれているプログラムの省略です。
boss_sc = boss_sc -1;となります。
ドット単位の座標では扱えないメソッドが存在するので、ブロック単位の座標に変換する。
射撃カウンターを用いて短時間に連続して攻撃を出させないようにする。
ただし、これを使いたい場合は除く。
また、攻撃する状態を別に用意し、その中で処理することもできます。
最後にもう一度確認しておきたいことがあります。
今回デクリメントという言葉を使いました。実は踏み判定の時もこれを使っています。
ここでインクリメントとデクリメントの詳しい説明を行いたいと思います。
インクリメントは「a++;」「++a;」と書き、変数の値を1増やします。
デクリメントはその反対で変数の値を1減らし、「a--;」「--a;」と書きます。
インクリメント演算子:++ デクリメント演算子:--しかしこの演算子を変数の前に置くか、後ろに置くかによって動作が若干違います。
処理 | aの値 | bの値 |
---|---|---|
a++ | 2 | - |
++a | 2 | - |
b=a++ | 2 | 1 |
b=++a | 2 | 2 |
a-- | 0 | - |
--a | 0 | - |
b=a-- | 0 | 1 |
b=--a | 0 | 0 |
/* b=++a */ a = a+1; //aに1加算した値をaに代入 b = a; //aの値をbに代入 /* b=--a */ a = a-1; //aに1減算した値をaに代入 b = a; //aの値をbに代入となります。つまり先に加算、減算を行ってから、その値を変数bに代入していいます。
/* b=a++ */ b = a; //aの値をbに代入 a = a+1; //aに1加算した値をaに代入 /* b=a-- */ b = a; //aの値をbに代入 a = a-1; //aに1減算した値をaに代入となります。先にaの値を変数bに代入してから加算、減算を行っています。