パワーアップ・複数種類の敵 - Javaでシューティングゲームを作ろう
目次
- Javaでシューティングゲームを作ろう
- 自機の左右移動
- 弾発射・はみ出しチェック
- 敵登場・仮想画面
- 当たり判定(敵と弾)・スコア
- 当たり判定(自機と敵)・シーン切り替え
- クラス化
- 継承・Vectorによるキャラ管理・サウンド
- パワーアップ・複数種類の敵
- ペンギンシューティング
今回の題材
- パワーアップ
- 複数の種類の敵
- ボス
一式ダウンロード
ソースの解説
さらにプログラムを拡張して行きます。まず複数の敵を出す方法ですが、これも継承を使います。前回はスーパークラスChrを継承してTekiクラスを作りましたが、今回はTekiクラスをさらに継承してそれぞれ独自の動きを持つ敵のクラスを作ります(ZakoA,ZakoB,ZakoC,Bossクラス)。
パワーアップは、Chrクラスを継承してItemクラスを作ります。
Jikiクラス
前回からの変更点として、- パワーアップ管理用の変数の追加
- パワーアップ時の弾の軌道を管理する配列を追加
- 無敵時間の追加
private int power; // パワー
パワーアップ用管理用の変数です。最初は0で、パワーアップアイテムを取ると1増え、敵と当たると1減ります。
private int muteki; // 無敵時間
無敵時間です。耐久力のある敵(ボス)に当たると一気にパワー0になってしまうのを防ぐため、敵に当たると一定時間無敵になるようにしています。
// 弾の速度配列
private static int tv[][] = {
{0, -8},
{-7, -7, 7, -7},
{-7, -7, 0, -8, 7, -7},
{-7, -7, 0, -8, 7, -7, -7, 7, 7, 7},
};
弾の軌道を管理するための配列です。上から順にパワー0,1,2,3、左から順に弾1のx座標,弾1のy座標,弾2のx座標,弾2のy座標…となっています。
for (int i = 0; i < tv[power].length; i += 2) {
app.addList(new Tama(x + w / 2, y, tv[power][i], tv[power][i + 1]));
}
上記弾の速度配列にしたがって、パワーアップした分だけ弾を発射しています。
// パワーアップ
void upPower() {
if (power >= tv.length - 1) {
// 最大パワーまで達していたらボーナス追加
app.addScore(1000);
} else {
power++;
}
}
パワーアップ変数を1増加させている部分です。自機がアイテムに衝突したときに呼ばれます。最大パワーまで達していたらそれ以上のパワーアップはせずにスコアを1000点増加させています。Itemクラス
自機のパワーアップアイテムのクラスです。ほぼ前回の敵クラスと同じ動きをします。Tekiクラス
敵の基本クラスです。それぞれの敵クラスに共通する部分を抽出して記述してあります。ZakoAクラス
Tekiクラスを継承して独自の敵を作り出しています。まっすぐ落ちてくるだけの敵です。ZakoBクラス
画面左右の端で反射しながら降りてくる敵です。
private int vx; // 横方向の速度
この変数によって反射を実現しています。
if (x < 0) vx = 8;
else if (x > app.getw() - w) vx = -8;
画面端に着いたら速度を反転している部分です。ZakoCクラス
自機を追尾する敵です。
private double vx, vy; // 速度
敵の速度です。敵と自機の位置関係によって増減します。
if (app.getJikix() > x) {
vx += tv;
if (vx > 8) vx = 8;
} else if (app.getJikix() < x) {
vx -= tv;
if (vx < -8) vx = -8;
}
if (app.getJikiy() > y) {
vy += tv;
if (vy > 8) vy = 8;
} else if (app.getJikiy() < y) {
vy -= tv;
if (vy < -8) vy = -8;
}
自機のx座標が敵のx座標よりも大きいとき、速度をプラスして敵が徐々に自機に向かうようにします。同じく自機のx座標が敵のx座標よりも小さいとき、速度をマイナスして敵が徐々に自機に向かうようにします。同じ処理をy座標についても繰り返しています。Bossクラス
ボスです。画面端で反射しながら動きます。
private int power; // 耐久力
ボスには耐久力をつけ、何発か弾を当てないと死なないようにします。
// 死亡
void dead() {
power--;
if (power < 0) super.dead();
}
ボスが弾に当たったときに呼ばれます。すぐ死ぬのではなく、まずパワーを減らしてそれが0になったときに初めて死ぬようにします。