[目次へ][前へ][次へ][表紙へ]
 スカッシュ・ゲームを作ろう その2(2/2)

 4.バーとボールの当たり判定

 当たり判定とは、物と物が当たっているかどうかを判定することです。ボールの絵とバーの絵とで、そのままの形で当たり判定を行うのは非常に困難です。そこでボールは16×16、バーは64×16の矩形に近似して行います。

 ボールのx座標は、左端がball_x、右端がball_x + 15です。バーのx座標は、左端がbar_x、右端がbar_x + 63です。ボールがバーに当たっている時、x座標はball_x + 15がbar_x以上で、かつ、ball_xがbar_x + 63以下です。

 ボールのy座標は、上端がball_y、下端がball_y + 15です。ボールとバーが接している時、ボールの下端がバーの上端より1ドット上(上図の赤い線)にあります。しかし、ball_speedの値によってはその位置には来ず、バーにめりこんでしまいます。
 そこで、ボールのどこかが赤い線に当たっていれば、当たりと判定します。つまり、ball_y + 15がbar_y - 1以上で、かつ、ball_yがbar_y - 1以下の時です。

 ボールがバーに当たったら、打ち返しの処理をします。

	;バーとボールの当たり判定
	if ball_x + 15 >= bar_x & ball_x <= bar_x + 63 & ball_y + 15 >= bar_y - 1 & ball_y <= bar_y - 1 {
		ball_y = bar_y - 16
		ball_pmy = -1
		score += 100
		hit_cnt++
		if hit_cnt == 5 {
			if ball_speed < 8 { ball_speed++ }
			hit_cnt = 0
		}
		mmplay 0
	}

		ball_y = bar_y - 16

 ball_yを強制的にbar_y - 16に(ボールがバーに接している状態に)します。

		hit_cnt++
		if hit_cnt == 5 {
			if ball_speed < 8 { ball_speed++ }
			hit_cnt = 0
		}

 hit_cntを1増やします。5になったらball_speedを1増やし、hit_cntを0に戻します。ただし、ball_speedの上限は8とします。

 5.ボールを落とした時の処理

 ボールのy座標が画面下端より下になったら、fall_fを立てます(フラグを1にすることを「フラグを立てる」と言います)。

	;ボールを落とした時の処理
	if ball_y >= 480 { fall_f = 1 }
 6.画面の更新

 画面の更新処理にボールの描画とスコアの表示を追加します。

	;ボールの描画
	pos ball_x, ball_y
	gmode 2
	celput 2
	;スコアの表示
	msx = 0 : msy = 0
	message = "SCORE:" + score
	gosub *Write_Message
 7.ゲームオーバー処理

 画面の更新処理の直後にゲームオーバー処理を追加します。

	;ゲームオーバー処理
	if fall_f == 1 {
		mmplay 2
		wait 200
		msx = 272 : msy = 232
		message = "GAME OVER"
		gosub *Write_Message
		wait 300
		goto *Title_Screen
	}

 fall_fが立っていたら、「ブ、ブー」という音を鳴らし、2秒待ち、"GAME OVER"と書き、3秒待ち、タイトル画面に戻ります。
 await命令では込み入った説明をしましたが、ただ単に待つだけなら

	wait 待ち時間(10ミリ秒単位)

 とします。

 この処理はボールを落とした時の処理でやってもいいのですが、その場合ボールが画面下端からはみ出したことが画面に反映されません。そこでフラグを立てておき、画面を更新した後にフラグが立っていたらゲームオーバー処理を行うようにしています。


 長くなってきたのでプログラム全体を掲載するのは省略します。どこにどう追加したのかは、サンプルをダウンロードしてご確認ください。


[サンプルをダウンロード]

補足
・初期位置のボール
 このサンプルでは「ゲームスタート時の初期設定」でボールの初期位置を設定していますが、すぐに移動処理を行うため、初期位置にある時のボールは描画されませんが、良しとしています。
 
・画像の重ね合わせ
 バーを移動させたらバーを描き、ボールを移動させたらボールを描く、という書き方もできるのですが、描画は一か所にまとめています。なぜかというと、画像の重ね合わせを気にするからです。後に描いたものほど上に(手前に)表示されます。シューティングゲームを例にしますと、自機を描画した後に背景を描いてしまったら、自機が消えてしまいます。それはすぐに分かると思いますが、敵と敵の弾が重なった時に、どちらを上に描くかはちょっと迷いますよね。描画を一か所にまとめておけば、後で並べ替えるのは簡単です。
 
・効果音
 効果音(SE : Sound Effect)は、フリー素材を探すのが手っ取り早いと思います。波形をいじらなければならないので、自分で作るのは非常に難しいと思われます。

[目次へ][前へ][次へ][表紙へ] inserted by FC2 system