初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

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 の符号を逆転させます。

 

論理演算子OR について

 

私はこの縦棒のことを声に出して言った記憶がありません。
調べてみると「バーティカルバー」というらしいです。

 

 

玉を跳ね返らせる仕組みについて説明します。
画面の左へ玉が出た場合を例にします。
73行目、( bx < 0 ) これで画面外へ出たか判断しています。
出た場合、spdx の符号を変えることにより、進む向きを変えるのです。

 

玉を跳ね返らせる仕組み

 

上下左右同じように処理して、画面内に跳ね返るようにしています。
ただし、67行目は仮の処理です。
本来ならば画面下へ玉が出たときゲームオーバーにするからです。
制作中はテストをするため跳ね返るようにします。

 

 

それでは実行して玉が跳ね返ってくるのを確認しましょう。

 

玉が跳ね返ってくるのを確認しよう