Pagi rekan-rekan sekalian, jumpa lagi dengan ogut dan kali ini ogut akan membagi cerita tentang deteksi tabrakan yang menggunakan panjang vektor. Panjang vektor sudah pernah dibahas pada artikel sebelumnya jadi ogut akan melewati bagian ini.
Contoh program yang ogut sertakan akan tampak seperti gambar di bawah ini.
Peluru akan terdeteksi menabrak objek jika peluru berada di dalam lingkaran (radius), makanya ogut kasih nama deteksi tabrakan ini dengan nama tabrakan radius supaya mudah diingat.
Untuk menyelesaikan masalah tabrakan radius perhatikanlah gambar di bawah ini.
Peluru yang ditembakan pesawat akan bergerak sesuai dengan arah yang ditentukan (translasi dengan titik koordinat atau vektor translasi), untuk mendeteksi terjadinya tabrakan cukup menggunakan dua buah vektor yaitu vektor Radius dan vektor peluru. Vektor radius adalah vektor dengan panjang sama dengan jari-jari objek (radius). Vektor peluru adalah vektor yang dibuat dari titik pusat objek ke titik pusat peluru. Cara mencari titik pusat sebuah objek persegipanjang atau bujursangkar pernah ogut bahas di artikel ini.
Penting!
Tabrakan akan terjadi jika panjang vektor peluru <= panjang vektor radius. Secara teori deteksi tabrakan radius lebih sederhana dari deteksi tabrakan dengan skala proyeksi vektor. Lalu kenapa tidak pakai saja metode ini untuk mendeteksi setiap tabrakan? Jawabnya sederhana saja rekan-rekan, metode tabrakan yang dipakai tergantung dari game yang Anda buat.
Ok selesai teorinya, sekarang programnya.
Pertama tentukan titik pusat objek bonus lalu tentukan vektor radius.
Public Sub SettingNilaiAwal()
...
...
...
'Titik Pusat Bonus
Dim TempVektor As Vektor_Properties
TempVektor = Create_Vektor(Bonus(0).Ax, Bonus(0).Ay, Bonus(0).Cx, Bonus(0).Cy)
TitikPusatBonus(0).M = (0.5 * TempVektor.i) + Bonus(0).Ax
TitikPusatBonus(0).N = (0.5 * TempVektor.j) + Bonus(0).Ay
TempVektor = Create_Vektor(Bonus(1).Ax, Bonus(1).Ay, Bonus(1).Cx, Bonus(1).Cy)
TitikPusatBonus(1).M = (0.5 * TempVektor.i) + Bonus(1).Ax
TitikPusatBonus(1).N = (0.5 * TempVektor.j) + Bonus(1).Ay
'Tentukan Radius Bonus disini
VektorRadiusBonus(0).i = 0
VektorRadiusBonus(0).j = 150 'Nilai Radius
VektorRadiusBonus(1).i = 0
VektorRadiusBonus(1).j = 80 'Nilai Radius
End Sub
Lalu cek kondisi tabrakan terjadi atau tidak antara peluru dan objek.
Private Sub Render_Peluru()
Dim i As Integer
Dim SkalaPro1, SkalaPro2 As Single
For i = 0 To 98
If Peluru_Fighter(i).GO_Active Then
'=====================================================
'periksa apakah peluru di dalam area tembak atau tidak
'=====================================================
'hitung titik pusat peluru
Titik_Pusat_Poligon(Peluru_Fighter(i), CenterX_Peluru, CenterY_Peluru)
'create vektor peluru
VektorPeluru = Create_Vektor(Area_Tembak_Xmin, Area_Tembak_Ymin, CenterX_Peluru, CenterY_Peluru)
'hitung skala proyeksi
SkalaPro1 = Dot_Product(VektorPeluru, VektorA) / (LVektorA * LVektorA)
SkalaPro2 = Dot_Product(VektorPeluru, VektorB) / (LVektorB * LVektorB)
If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
'============================================
'peluru berada di area tembak
'proses deteksi tabrakan dengan bonus dimulai
'============================================
For j = 0 To 1
'create vektor peluru
VektorPeluru = Create_Vektor(TitikPusatBonus(j).M, TitikPusatBonus(j).N, CenterX_Peluru, CenterY_Peluru)
'hitung Panjang Vektor Peluru, jika panjang vektor peluru <= vektor Radius maka tabrakan terjadi
If Panjang_Vektor(VektorPeluru) <= Panjang_Vektor(VektorRadiusBonus(j)) Then
'=====================
'peluru menabrak bonus
'=====================
Peluru_Fighter(i).GO_Active = False
Bonus(j).Hit_Status = True
Sound2.Play()
End If
Next
Else
'non aktifkan peluru yang tidak di dalam area tembak
Peluru_Fighter(i).GO_Active = False
End If
End If
If Peluru_Fighter(i).GO_Active Then
GL.Enable(EnableCap.Blend)
GL.BlendFunc(BlendingFactorSrc.DstColor, BlendingFactorDest.Zero)
'Mask
GL.BindTexture(TextureTarget.Texture2D, Peluru_FBMP_Mask)
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
GL.End()
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One)
'BMP
GL.BindTexture(TextureTarget.Texture2D, Peluru_FBMP)
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
GL.End()
GL.Disable(EnableCap.Blend)
If CheckBox2.Checked = True Then
'warna merah untuk garis
GL.BindTexture(TextureTarget.Texture2D, Red)
GL.Begin(BeginMode.LineLoop)
GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
GL.End()
End If
'=================================
'translasi peluru dengan vektornya
'=================================
Peluru_Fighter(i).Ax = Peluru_Fighter(i).Ax + Peluru_Fighter(i).Vektor.i
Peluru_Fighter(i).Bx = Peluru_Fighter(i).Bx + Peluru_Fighter(i).Vektor.i
Peluru_Fighter(i).Cx = Peluru_Fighter(i).Cx + Peluru_Fighter(i).Vektor.i
Peluru_Fighter(i).Dx = Peluru_Fighter(i).Dx + Peluru_Fighter(i).Vektor.i
Peluru_Fighter(i).Ay = Peluru_Fighter(i).Ay + Peluru_Fighter(i).Vektor.j
Peluru_Fighter(i).By = Peluru_Fighter(i).By + Peluru_Fighter(i).Vektor.j
Peluru_Fighter(i).Cy = Peluru_Fighter(i).Cy + Peluru_Fighter(i).Vektor.j
Peluru_Fighter(i).Dy = Peluru_Fighter(i).Dy + Peluru_Fighter(i).Vektor.j
End If
Next
End Sub
Selesai dah cerita tentang deteksi tabrakan radius, sederhana sekali yah tapi manfaatnya luaaaarrrr biiiiaaaasaaaaa, dan sekali lagi Bang Victor (baca vektor, plesetan dari vektor) membuktikan dirinya emang pantas dikasih jempol, jika bukan karena Bang Victor maka program ini tidak selesai.
Update 2 Jan 2015
Contoh program yang dibuat dengan matematika vektor
Selamat belajar rekan-rekan, salam sukses
Heriady
heriady.yoh@gmail.com
Artikel terkait
...
...
...
'Titik Pusat Bonus
Dim TempVektor As Vektor_Properties
TempVektor = Create_Vektor(Bonus(0).Ax, Bonus(0).Ay, Bonus(0).Cx, Bonus(0).Cy)
TitikPusatBonus(0).M = (0.5 * TempVektor.i) + Bonus(0).Ax
TitikPusatBonus(0).N = (0.5 * TempVektor.j) + Bonus(0).Ay
TempVektor = Create_Vektor(Bonus(1).Ax, Bonus(1).Ay, Bonus(1).Cx, Bonus(1).Cy)
TitikPusatBonus(1).M = (0.5 * TempVektor.i) + Bonus(1).Ax
TitikPusatBonus(1).N = (0.5 * TempVektor.j) + Bonus(1).Ay
'Tentukan Radius Bonus disini
VektorRadiusBonus(0).i = 0
VektorRadiusBonus(0).j = 150 'Nilai Radius
VektorRadiusBonus(1).i = 0
VektorRadiusBonus(1).j = 80 'Nilai Radius
End Sub
Lalu cek kondisi tabrakan terjadi atau tidak antara peluru dan objek.
Private Sub Render_Peluru()
Dim i As Integer
Dim SkalaPro1, SkalaPro2 As Single
For i = 0 To 98
If Peluru_Fighter(i).GO_Active Then
'=====================================================
'periksa apakah peluru di dalam area tembak atau tidak
'=====================================================
'hitung titik pusat peluru
Titik_Pusat_Poligon(Peluru_Fighter(i), CenterX_Peluru, CenterY_Peluru)
'create vektor peluru
VektorPeluru = Create_Vektor(Area_Tembak_Xmin, Area_Tembak_Ymin, CenterX_Peluru, CenterY_Peluru)
'hitung skala proyeksi
SkalaPro1 = Dot_Product(VektorPeluru, VektorA) / (LVektorA * LVektorA)
SkalaPro2 = Dot_Product(VektorPeluru, VektorB) / (LVektorB * LVektorB)
If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
'============================================
'peluru berada di area tembak
'proses deteksi tabrakan dengan bonus dimulai
'============================================
For j = 0 To 1
'create vektor peluru
VektorPeluru = Create_Vektor(TitikPusatBonus(j).M, TitikPusatBonus(j).N, CenterX_Peluru, CenterY_Peluru)
'hitung Panjang Vektor Peluru, jika panjang vektor peluru <= vektor Radius maka tabrakan terjadi
If Panjang_Vektor(VektorPeluru) <= Panjang_Vektor(VektorRadiusBonus(j)) Then
'=====================
'peluru menabrak bonus
'=====================
Peluru_Fighter(i).GO_Active = False
Bonus(j).Hit_Status = True
Sound2.Play()
End If
Next
Else
'non aktifkan peluru yang tidak di dalam area tembak
Peluru_Fighter(i).GO_Active = False
End If
End If
If Peluru_Fighter(i).GO_Active Then
GL.Enable(EnableCap.Blend)
GL.BlendFunc(BlendingFactorSrc.DstColor, BlendingFactorDest.Zero)
'Mask
GL.BindTexture(TextureTarget.Texture2D, Peluru_FBMP_Mask)
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
GL.End()
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One)
'BMP
GL.BindTexture(TextureTarget.Texture2D, Peluru_FBMP)
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
GL.End()
GL.Disable(EnableCap.Blend)
If CheckBox2.Checked = True Then
'warna merah untuk garis
GL.BindTexture(TextureTarget.Texture2D, Red)
GL.Begin(BeginMode.LineLoop)
GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
GL.End()
End If
'=================================
'translasi peluru dengan vektornya
'=================================
Peluru_Fighter(i).Ax = Peluru_Fighter(i).Ax + Peluru_Fighter(i).Vektor.i
Peluru_Fighter(i).Bx = Peluru_Fighter(i).Bx + Peluru_Fighter(i).Vektor.i
Peluru_Fighter(i).Cx = Peluru_Fighter(i).Cx + Peluru_Fighter(i).Vektor.i
Peluru_Fighter(i).Dx = Peluru_Fighter(i).Dx + Peluru_Fighter(i).Vektor.i
Peluru_Fighter(i).Ay = Peluru_Fighter(i).Ay + Peluru_Fighter(i).Vektor.j
Peluru_Fighter(i).By = Peluru_Fighter(i).By + Peluru_Fighter(i).Vektor.j
Peluru_Fighter(i).Cy = Peluru_Fighter(i).Cy + Peluru_Fighter(i).Vektor.j
Peluru_Fighter(i).Dy = Peluru_Fighter(i).Dy + Peluru_Fighter(i).Vektor.j
End If
Next
End Sub
Selesai dah cerita tentang deteksi tabrakan radius, sederhana sekali yah tapi manfaatnya luaaaarrrr biiiiaaaasaaaaa, dan sekali lagi Bang Victor (baca vektor, plesetan dari vektor) membuktikan dirinya emang pantas dikasih jempol, jika bukan karena Bang Victor maka program ini tidak selesai.
Update 2 Jan 2015
Contoh program yang dibuat dengan matematika vektor
Selamat belajar rekan-rekan, salam sukses
Heriady
heriady.yoh@gmail.com
Artikel terkait
Mendeteksi Posisi dengan Vektor Proyeksi
|
|
Animasi Game 2D dengan Translasi
|
|
Deteksi Tabrakan dengan Proyeksi Vektor
|
|
Vektor R2
|
fungsi Create_Vektor dari mana?
BalasHapusBaca ini dulu
BalasHapushttp://heriadyblog.blogspot.co.id/2015/07/matematika-untuk-program-game-vektor-r2.html