今からはじめるプログラミング60(シューティングその5)
弾の飛び方を編集というよりは、弾の描画を細長い四角にして、
あたり判定の範囲を編集することでレーザーを表現したけれど。
もう少し数学的な形でゲームを演出できないか、とか考えたけど無理でしたw
ま、x(よこ)とy(たて)という座標で普通に2次方程式とか連想できるかな?とか思ったんですが。
ゲームてきには、レーザーの次は散弾ができた、というだけのこと?
とはいえ、意外と面倒だった。
考え方としては、
・弾にも方向という属性を追加する。
そうすれば、プログラム的に判断できるのでは?
というところ。
そう思って、Bulletクラスに変更を加えたところ・・・。
以下(⬇️)のような感じ。
-----------------------------------
package sample20;
/***
* たま
***/
public class Bullet {
public int x, y;
public int direction;
public Bullet() {}
public Bullet(int x, int y,int direction) {
this.x = x;
this.y = y;
this.direction = direction;
}
}
-----------------------------------
おっと、コンストラクタまでいじってしまった。
するとどうでしょう?当たり前ですが、関連するクラス(Shooting)にエラーがいっぱい。
という感じで、おかしな方法で修正箇所を洗い出しました。
(業務プログラムでこんな洗い出し方法はやらないので参考にしないでね?)
修正箇所をみてみると。
・敵の弾を生成しているところ。240行目付近と280行目付近。(すいません、修正のたびにコメントを追加しているので、ソースのリビジョンごとに行数がかわります。リビジョンて。)
・味方の弾を生成しているところ。390行付近のスペースキーのif文あたり。
とはいえ、オブジェクトの生成(コンストラクタの実行)の所だけなので、追加した方向について、xもしくはyを加算(減算)しないと弾の方向がかわらないので、上記の修正に加え、弾が移動している場所。
・310行付近の敵の弾のyに10を足してるところ。
・140行目付近の味方の弾のyから10を引いているところ。
以上ですかね。弾の動きを散弾っぽく見せるには、最後の味方の弾の動きについて、まっすぐに飛ぶ、右斜め上に飛ぶ、左斜め上に飛ぶ、の3つに分けます。
というわけで、
方向としては、
まっすぐ、右上、左上
をそれぞれ、1,0,2としました。
ちょっとおかしくなってしまってすいません。0:左上、1:まっすぐ、2:右上というふうに、画面上のイメージで値を設定していまいました。
・・・こういうのを防ぐ効果もEnumにはあるのですね。それはまた今度。
というわけで、とりあえず敵の弾を生成するところは、1のまっすぐのみでコンストラクタを修正し、味方の弾は、今まで1つだったところに行をコピーして3つ生成するようにしました。
---------------------------------------------------
Shootingクラスのスペースキーのif文のところ。
bullets_player.add(new Bullet(playerX + 12, playerY, 0));
bullets_player.add(new Bullet(playerX + 12, playerY, 1));
bullets_player.add(new Bullet(playerX + 12, playerY, 2));
---------------------------------------------------
そして、プレイヤーの弾の移動も以下のように
if (1 == bullet.direction) {
// 1==まっすぐ
bullet.y -= 10;
} else {
if (0 == bullet.direction) {
// 0==右上に
bullet.y -= 8;
bullet.x += 2;
} else {
// may be 2 == 左上に
bullet.y -= 8;
bullet.x -= 2;
}
}
---------------------------------------------------
という感じで、yから10を引いていただけのところに、方向によって、xにも加算したり、減算したりしました。とはいえ、業務プログラム的にはあまりよろしい修正ではないので、できたら理想のかたち?を考えて修正してみてください。
⬇️無料だと思ったら、kindleUnlimitedの契約がないと無料ではないそうです。