UFOゲームの制作 VB6 | |
(4) タイマーによる処理 X |
6. 当たりの判定(1)
当たりの判定では、自機弾が敵及びUFOに当たったか、敵弾が自機に当たったかを判定する必要がある。当たりとは、自機弾の座標(Left,Top)と敵の座標を比較して判定する。
まずは、当たりかどうかの判定をする処理を関数(ファンクションプロシージャ)isAtariとして作成する。当たりであればTrue、ハズレであればFalseが得られるようにする。
当たり判定関数 isAtari
・四角で判定
敵と自機弾の場合で考える。
敵本体の横幅の範囲に自機弾のx座標があり、かつ、敵本体の縦幅に自機弾のy座標があれば当たりと判定できる。左図のように四角の中に弾があればということになる。
敵本体のオブジェクト名をhontai、自機弾のオブジェクト名をtamaとすると次のような判定文になる。
If tama.Left >= hontai.Left And tama.Left <= hontai.Left + hontai.Width _ And tama.Top >= hontai.Top And tama.Top <= hontai.Top + hontai.Height Then <<当たりの処理>>
これが自機弾左上の座標(tama.Left, tama.Top)が敵本体の四角内にあるかどうかの判定文である。自機弾も四角なので自機弾の四つの角について調べる必要がある。また、この判定では自機弾が敵の足の白い部分に入ったら当たり判定されてしまう。人間の目ではハッキリと判らないのでこの判定でも良い。
・円で判定
敵本体の中心を円の中心として、自機弾がこの円の内部に入れば当たりと判定する方法もある。
円の中心座標(x0,y0)を原点(0,0)、円周上の座標を(x,y)、半径をrとすれば次の式が成り立つ。
r2 = x2 + y2
この式を利用して、自機弾の座標が半径r内にあるかどうかを判定することもできる。ただし、円の場合、左図のように青色の円では敵の両サイドが範囲に入らないし、ピンクの円では大きすぎるという問題がある。敵が正方形であれば円の判定も使える。
If Sqr(tama.Left ^ 2 + tama.Top ^ 2) <= r Then
<<当たりの処理>>
四角の時と同じで、自機弾の四つの角について調べる必要がある。
・楕円で判定
敵本体の中心を楕円の中心として、自機弾がこの円の内部に入れば当たりと判定する。楕円の中心座標(x0,y0)を原点(0,0)、円周上の座標を(x,y)、横の半径をa、縦の半径をbとすれば次の式が成り立つ。
If tama.Left ^ 2 / a ^ 2 + tama.Top ^ 2 / b ^ 2 <= 1 Then
<<当たりの処理>>
四角の時と同じで、自機弾の四つの角について調べる必要がある。
ここでは、この楕円の判定式を使うことにする。
IsAtari関数は2つのイメージオブジェクト、例えば敵と自機弾のイメージを引数として受け取り、結果はTrue,またはFalseを返すことにする。関数は次のように定義する。
Function isAtari(hontai As Image, tama As Image) As Boolean
このように、Image型の値を2つ受け取り、結果はBoolean型を返す。
使い方は、次のようにIf文で使う。
If isAtari(imgTeki(n), imgTama1(nn)) = True Then
<<当たりの処理>>
・プログラムリスト
Private Function isAtari(hontai As Image, tama As Image) As Boolean '弾が敵または自機に当たったかを判定する。 '当たり=True, 外れ=False Dim hx0 As Integer, hy0 As Integer '本体中心座標用 Dim a As Integer, b As Integer '楕円半径用 Dim tx1 As Integer, ty1 As Integer '弾左上座標用 Dim tx2 As Integer, ty2 As Integer '弾右下座標用 '座標計算 hx0 = hontai.Left + hontai.Width / 2 '本体中心x0座標 hy0 = hontai.Top + hontai.Height / 2 '本体中心y0座標 a = hontai.Width / 2 '楕円半径a b = hontai.Height / 2 '楕円半径b tx1 = tama.Left - hx0 '弾左上x1座標(本体中心座標を原点) ty1 = tama.Top - hy0 '弾左上y1座標( 〃 ) tx2 = tama.Left + tama.Width - hx0 '弾右下x2座標( 〃 ) ty2 = tama.Top + tama.Height - hy0 '弾右下y2座標( 〃 ) '当たり判定 If tx1 ^ 2 / a ^ 2 + ty1 ^ 2 / b ^ 2 <= 1 Then isAtari = True ElseIf tx1 ^ 2 / a ^ 2 + ty2 ^ 2 / b ^ 2 <= 1 Then isAtari = True ElseIf tx2 ^ 2 / a ^ 2 + ty1 ^ 2 / b ^ 2 <= 1 Then isAtari = True ElseIf tx2 ^ 2 / a ^ 2 + ty2 ^ 2 / b ^ 2 <= 1 Then isAtari = True Else isAtari = False End If End Function
(4) タイマーによる処理 X | |
Copyright © 2002 Hiroshi Masuda |