Processing 入門
15.ブロック崩し2 壁との当たり判定
今回は「ブロック崩しを作ろう」の続きです。
1976年に「ブレイクアウト」という名前でブロック崩しが誕生しました。
リアルタイムで遊んでいた私は、どんな仕組みで動いているのか
すごく興味を持っていました。
思えばあの頃からゲームプログラマーになりたかったのかもしれません。
玉を表示しよう
玉( ball )の表示を行います。
複数の玉が出てくるブロック崩しが多いのですが、ここではシンプルに
玉を1つとします。
ですから必要な変数も1つずつ用意します。
位置座標、速度、幅と高さを作ります。
6-9行目、座標と速度の変数を float で宣言しています。
今回のゲームでは整数しか使わないので int でも良かったのですが
微妙な速度調整をしたくなった時のために小数点も使えるようにしました。
gameInit ( ) では各変数の初期化をしています。
幅と高さは固定なので、宣言のときに設定しました。
gamePlay ( ) では玉の移動と表示するための関数を呼んでいます。
玉の表示や移動のしくみはこれまでと同じですが、
58行と61行目に注目してください。
絵の中心となる基点を変更しています。
通常、何も指定しなければ 左上が基点 となります。
つまり imageMode (CORNER) の状態です。
ではなぜ センター に変更するのか
それは玉とその他のオブジェクト(自機や壁やブロック)との当たり判定を
簡単にするためです。
基点が左上にあると、壁と玉の距離が左右上下変わってきます。
次の画像を見てください。
これは左右の例ですが、上下でも同じことが言えます。
基点を中心にすると、上下左右どの距離も同じように計算できます。
ちなみに、玉の表示のあと CORNER モードに戻しています。
これは他のオブジェクトの描画を簡単にするためです。
CENTER モードですべてを描くこともですますが、少し面倒になります。
興味があるなら一度試してみてください。
では実行してみましょう。
玉は左下へ移動して画面の外へ出てしまいます。
関数 ballMove ( ) を見てください。
ここで玉の移動をしています。
移動する方向の意味が分からない時には、変数 spdx, spdy の初期値を変えて
いろいろテストしてみましょう。
テストの後は2に戻しておきましょう。
壁との当たり判定をつけよう
ここで縦棒のキーを覚えましょう。
次のところにあります。シフトキーを押しながら入力します。
私はこの記号を「縦棒」または「パイプ」と言っていました。
ネットで調べてみると「バーティカルバー」というらしいです。
玉が画面外へ出ないように、画面の端を壁として当たり判定をつけます。
次のようにプログラムを変更してください。
height は画面の高さ、width は画面の幅が入っています。
これらを使って画面の端を調べます。
73行目、論理演算子 OR を使っています。
if ( A || B ) {
…どちらかが真のとき実行する
}
A と B の2つの式のどちらかが「真」のとき if 文の中が実行されます。
今回であれば、玉のx座標が0よりも小さい、または、画面の幅より大きいとき変数 spdx の符号を逆転させます。
玉を跳ね返らせる仕組みについて説明します。
画面の左へ玉が出た場合を例にします。
73行目、( bx < 0 ) これで画面外へ出たか判断しています。
出た場合、spdx の符号を反転させることで、進む向きを変えます。
上下左右同じように処理して、画面内に跳ね返るようにしています。
ただし、67行目は仮の処理です。
本来ならば画面下へ玉が出たときゲームオーバーにするからです。
制作中はテストをするため跳ね返るようにします。
それでは実行して玉の跳ね返りを確認しましょう。