・実行画面
・敵の移動
敵は、画面上の方に表示して乱数で左右に動かします。
弾は、自機の弾は上の方へ敵の弾は下の方へ移動するわけですが、
敵の弾は「誘導弾」にしましょう。共に、単発とし画面上に一つだけとします
(要するに、画面上に自分の弾がある時は新たに発射できない)。そのため、
発射しているかを表すboolean 型変数ls,els を用意します。
なぜこんな制限を付けるかというと、弾の動きは一つ一つ処理しなければならないので、
現在表示されている弾はすべて把握しておく必要があるからです。
その処理を単純にするために、
今回は弾の数を自機・敵それぞれ一つのみに制限しました。
弾を発射するのは、自機はマウスボタンが押されたら(mouseDown
イベント)、敵は乱数で発射します。
敵の弾を誘導する処理は、敵の弾のx 座標を現在の自機のx 座標へ「近づける」事で行います。自機が敵の弾より左にあるなら、 弾を左に、右にあるなら右に動かす。ただし、 ある程度精度や移動量に「幅」をもたせるために、判定や移動量に乱数を加えます。 弾のy 座標は、自機・敵とも特別な処理はせずに一定値を増減するだけです。
プログラムでは自機のx 座標はx で敵弾のx 座標はelx ですので、 単純に自機が敵弾の右にあるかを調べるなら、
if (elx<x) となります。左にあるかを調べるなら、
if (elx>x+32) ですね(x
は自機の左端の座標で自機の大きさは横32ドット)。
ただし、これだと精度が常に一定で面白くないので、乱数を加えて精度を落としてやります。 例えば自機が右にあるかを調べる時、if (elx<x-(rnd.nextInt() % 24)+48) としてやれば、精度を乱数で変えてやる事ができます。これは、自機と敵弾とのx 座標が近い時に、かなり大きな影響を与え難易度も変わってくるはずです。逆に、 この部分の乱数や加える値の大きさを変えれば難易度を調整する事もできるでしょう。 なお、% は「余り」の記号ですので、Random.nextInt() % 24 とすると-23から23の値が得られます(nextInt() は乱数で符号付き整数を返す)。
また、敵弾のx 座標を自機のx 座標に近づける時にも同じ値だけ近づけるのではなく、乱数を加えました。 例えば、敵弾を右に動かす時にelx=elx+(6+rnd.nextInt() % 3); とすれば動かす大きさをランダムに4から8ドットの幅で変える事ができるでしょう。 これで、敵の弾が自機の方へ近づいてくるようになったので、 敵が弾を打ってきたら左右に自機を動かしてみてください。
なお、これらの処理を一定時間ごとに行うためには、スレッドの中で順に自機と敵の移動、 それぞれの弾の移動を行った後に一定時間「ウエイト」をいれます。