Update 1 Jan 2016
Selamat pagi sobat-sobit dan rekan-rekan sekalian, pada kesempatan kali ini ogut akan membahas vektor lagi, ya vektor lagi, tidak bosan-bosan ogut akan bercerita tentang vektor, karena beliau inilah yang amat sangat berjasa membantu jika rekan-rekan asyik membuat program game.
Vektor yang akan ogut bahas dikasih nama vektor pantul biar mudah mengingatnya. Vektor pantul diperlukan untuk game yang menggunakan efek animasi memantul seperti game bola sodok (billiard) dan game pinball.
Walaupun efek animasi seperti ini tergolong rumit tetapi dengan menggunakan vektor efek ini menjadi sangat mudah untuk dibuat.
Teori Vektor Pantul
Di gambar di bawah terlihat sebuah bola yang bergerak menuju tembok, setelah bola menabrak tembok maka bola akan memantul dengan arah menjauh dari tembok.
Bila digambarkan maka vektor gerakan bola akan menjadi seperti berikut.
Penting!
Sudut datang (Ө˚) selalu sama dengan sudut pantul.
Untuk mencari vektor pantul diperlukan dua buah vektor bantu yaitu vektor a(tembok) dan vektor tl(tegak lurus).
Setelah vektor bantu ditentukan, langkah pertama untuk mencari vektor pantul adalah memproyeksikan vektor datang ke vektor a.
Langkah kedua proyeksikan vektor datang ke vektor tl.
Dan langkah terakhir untuk menentukan vektor pantul adalah membalik arah vektor proyeksi2 lalu menggabungkannya dengan vektor proyeksi1.
Dengan menggunakan langkah-langkah di atas maka vektor pantul dapat dicari sehingga arah bola yang memantul dapat ditentukan posisinya.
Program implementasi vektor pantul yang ogut sertakan adalah program peluru bumerang, bumerang akan memantul jika menabrak tembok.
Berikut koding program yang harus Anda perhatikan untuk membuat program vektor pantul.
Tentukan nilai awal untuk objek.
Public Sub SettingNilaiAwal()
'fighter
Fighter.Ax = 420 : Fighter.Ay = 120
Fighter.Bx = 580 : Fighter.By = 120
Fighter.Cx = 580 : Fighter.Cy = 280
Fighter.Dx = 420 : Fighter.Dy = 280
Fighter.d_X = 25
Fighter.d_Y = 25
Fighter.Index_Tekstur = 1
Indeks_Tekstur_Fighter = 1
Delay_Tekstur_Fighter = 1
Plus_Indeks_Tekstur_Fighter = True
'=================================
'cos 45 = 0.7071, sin 45 = 0.7071
'buat 8 buah vektor fighter dengan
'menggunakan aturan trigonometri
'=================================
'arah utara
Vektor_Fighter(0).i = 0 : Vektor_Fighter(0).j = Fighter.d_Y
'arah timur laut
Vektor_Fighter(1).i = Fighter.d_X * 0.7071
Vektor_Fighter(1).j = Fighter.d_Y * 0.7071
'arah timur
Vektor_Fighter(2).i = Fighter.d_X : Vektor_Fighter(2).j = 0
'arah tenggara
Vektor_Fighter(3).i = Fighter.d_X * 0.7071
Vektor_Fighter(3).j = -Fighter.d_Y * 0.7071
'arah selatan
Vektor_Fighter(4).i = 0 : Vektor_Fighter(4).j = -Fighter.d_Y
'arah barat daya
Vektor_Fighter(5).i = -Fighter.d_X * 0.7071
Vektor_Fighter(5).j = -Fighter.d_Y * 0.7071
'arah barat
Vektor_Fighter(6).i = -Fighter.d_X : Vektor_Fighter(6).j = 0
'arah barat laut
Vektor_Fighter(7).i = -Fighter.d_X * 0.7071
Vektor_Fighter(7).j = Fighter.d_Y * 0.7071
Dim i As Integer
Counter_Delay_Bumerang = 99
'Bumerang
For i = 0 To 98
Bumerang(i).GO_Active = False
Next
'Tembok(0) mendatar bawah
Tembok(0).Ax = -GlControl1.Width + 10
Tembok(0).Ay = -GlControl1.Height + 60
Tembok(0).Bx = Tembok(0).Ax + 1200
Tembok(0).By = Tembok(0).Ay
Tembok(0).Cx = Tembok(0).Bx
Tembok(0).Cy = Tembok(0).By - 50
Tembok(0).Dx = Tembok(0).Ax
Tembok(0).Dy = Tembok(0).Cy
'vektor bantu a
Tembok(0).VektorA.i = Tembok(0).Bx - Tembok(0).Ax
Tembok(0).VektorA.j = Tembok(0).By - Tembok(0).Ay
Tembok(0).VektorB.i = Tembok(0).Dx - Tembok(0).Ax
Tembok(0).VektorB.j = Tembok(0).Dy - Tembok(0).Ay
'vektor bantu tegak lurus
Tembok(0).VektorTL.i = 0
Tembok(0).VektorTL.j = 1
'Tembok(1) tegak kiri
Tembok(1).Ax = -GlControl1.Width + 70
Tembok(1).Ay = -GlControl1.Height + 200
Tembok(1).Bx = Tembok(1).Ax
Tembok(1).By = Tembok(1).Ay + 800
Tembok(1).Cx = Tembok(1).Bx - 50
Tembok(1).Cy = Tembok(1).By
Tembok(1).Dx = Tembok(1).Cx
Tembok(1).Dy = Tembok(1).Ay
'vektor bantu a
Tembok(1).VektorA.i = Tembok(1).Bx - Tembok(1).Ax
Tembok(1).VektorA.j = Tembok(1).By - Tembok(1).Ay
Tembok(1).VektorB.i = Tembok(1).Dx - Tembok(1).Ax
Tembok(1).VektorB.j = Tembok(1).Dy - Tembok(1).Ay
'vaktor bantu tegak lurus
Tembok(1).VektorTL.i = 1
Tembok(1).VektorTL.j = 0
'area tembak
Area_Tembak_Xmin = -GlControl1.Width
Area_Tembak_Xmax = GlControl1.Width
Area_Tembak_Ymin = -GlControl1.Height
Area_Tembak_Ymax = GlControl1.Height
'create vektorA
VektorA.i = Area_Tembak_Xmax - Area_Tembak_Xmin
VektorA.j = 0
'create vektorB
VektorB.i = 0
VektorB.j = Area_Tembak_Ymax - Area_Tembak_Ymin
LVektorA = Panjang_Vektor(VektorA)
LVektorB = Panjang_Vektor(VektorB)
'======================
'nilai awal untuk bonus
'======================
'Bonus(0)
Bonus(0).Ax = 25 : Bonus(0).Ay = 225
Bonus(0).Bx = 175 : Bonus(0).By = 225
Bonus(0).Cx = 175 : Bonus(0).Cy = 375
Bonus(0).Dx = 25 : Bonus(0).Dy = 375
Bonus(0).Hit_Status = False
'Bonus(1)
Bonus(1).Ax = -375 : Bonus(1).Ay = -175
Bonus(1).Bx = -225 : Bonus(1).By = -175
Bonus(1).Cx = -225 : Bonus(1).Cy = -25
Bonus(1).Dx = -375 : Bonus(1).Dy = -25
Bonus(1).Hit_Status = False
'create VektorBonusA
VektorBonusA.i = Bonus(0).Bx - Bonus(0).Ax
VektorBonusA.j = 0
'create VektorBonusB
VektorBonusB.i = 0
VektorBonusB.j = Bonus(0).Dy - Bonus(0).Ay
LVektorBonusA = Panjang_Vektor(VektorBonusA)
LVektorBonusB = Panjang_Vektor(VektorBonusB)
End Sub
Mengisi peluru Bumerang jika user menekan tombol ‘F’.
Private Sub Tekan_Keyboard()
...
...
...
'====================================
'tombol 'f' untuk rapid fire bumerang
'====================================
If (GetKeyState(Keys.F) And &H1000) Then
If Counter_Delay_Bumerang >= 10 Then
Reload_Bumerang()
Sound1.Play()
Counter_Delay_Bumerang = 0
Else
Counter_Delay_Bumerang = Counter_Delay_Bumerang + 1
End If
End If
End Sub
Private Sub Reload_Bumerang()
Dim i, j As Integer
For j = 1 To 2
For i = 0 To 98
If Bumerang(i).GO_Active = False Then
Bumerang(i).GO_Active = True
'isi koordinat bumerang
Bumerang(i).Ax = Fighter.Ax - 50
Bumerang(i).Ay = ((Fighter.Dy - Fighter.Ay) / 2) + Fighter.Ay - 25
Bumerang(i).Bx = Bumerang(i).Ax + 50
Bumerang(i).By = Bumerang(i).Ay
Bumerang(i).Cx = Bumerang(i).Bx
Bumerang(i).Cy = Bumerang(i).By + 50
Bumerang(i).Dx = Bumerang(i).Ax
Bumerang(i).Dy = Bumerang(i).Cy
'setting vektor bumerang
If j = 1 Then
Bumerang(i).Vektor.i = -16.9037
Bumerang(i).Vektor.j = 4.5293
End If
If j = 2 Then
Bumerang(i).Vektor.i = -16.9037
Bumerang(i).Vektor.j = -4.5293
End If
i = 99
End If
Next
Next
End Sub
Deteksi tabrakan antara Bonus dan Bumerang serta Tembok dengan Bumerang.
Private Sub Render_Bumerang()
Dim i, j As Integer
Dim SkalaPro1, SkalaPro2 As Single
For i = 0 To 98
If Bumerang(i).GO_Active Then
'===========================================
'periksa apakah bumerang di area game screen
'===========================================
'hitung titik pusat bumerang
Titik_Pusat_Poligon(Bumerang(i), CenterX_Bumerang, CenterY_Bumerang)
'create vektor Bumerang
VektorBumerang = Create_Vektor(-GlControl1.Width, -GlControl1.Height, CenterX_Bumerang, CenterY_Bumerang)
'hitung skala proyeksi
SkalaPro1 = Dot_Product(VektorBumerang, VektorA) / (LVektorA * LVektorA)
SkalaPro2 = Dot_Product(VektorBumerang, VektorB) / (LVektorB * LVektorB)
If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
'============================================
'Bumerang berada di dalam area game screen,
'proses deteksi tabrakan dengan bonus dimulai
'============================================
For j = 0 To 1
'create vektor bumerang
VektorBumerang = Create_Vektor(Bonus(j).Ax, Bonus(j).Ay, CenterX_Bumerang, CenterY_Bumerang)
'hitung skala proyeksi
SkalaPro1 = Dot_Product(VektorBumerang, VektorBonusA) / (LVektorBonusA * LVektorBonusA)
SkalaPro2 = Dot_Product(VektorBumerang, VektorBonusB) / (LVektorBonusB * LVektorBonusB)
If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
'========================
'tabrakan antara bumerang
'dengan bonus terjadi
'========================
Bumerang(i).GO_Active = False
Bonus(j).Hit_Status = True
Sound2.Play()
Else
'==============================
'proses deteksi tabrakan antara
'bumerang dan tembok
'==============================
'create vektor bumerang
VektorBumerang = Create_Vektor(Tembok(j).Ax, Tembok(j).Ay, CenterX_Bumerang, CenterY_Bumerang)
'hitung skala proyeksi
SkalaPro1 = Dot_Product(VektorBumerang, Tembok(j).VektorA) / (Panjang_Vektor(Tembok(j).VektorA) * Panjang_Vektor(Tembok(j).VektorA))
SkalaPro2 = Dot_Product(VektorBumerang, Tembok(j).VektorB) / (Panjang_Vektor(Tembok(j).VektorB) * Panjang_Vektor(Tembok(j).VektorB))
If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
'========================
'tabrakan antara bumerang
'dengan tembok terjadi
'========================
'menghitung vektor Pantul
Dim VPantul As Vektor_Properties
Dim VProyeksi1 As Vektor_Properties
Dim VProyeksi2 As Vektor_Properties
'hitung proyeksi antara
'vektor bumerang(vektor datang)
'dengan vektor A(tembok)
VProyeksi1 = Proyeksi_Vektor(Bumerang(i).Vektor, Tembok(j).VektorA)
'hitung proyeksi antara
'vektor bumerang(vektor datang)
'dengan vektor TL
VProyeksi2 = Proyeksi_Vektor(Bumerang(i).Vektor, Tembok(j).VektorTL)
'invers VProyeksi2
VProyeksi2.i = -1 * VProyeksi2.i
VProyeksi2.j = -1 * VProyeksi2.j
'hitung vektor pantul
VPantul.i = VProyeksi1.i + VProyeksi2.i
VPantul.j = VProyeksi1.j + VProyeksi2.j
'==========================
'isi vektor bumerang dengan
'vektor pantul
'==========================
Bumerang(i).Vektor.i = VPantul.i
Bumerang(i).Vektor.j = VPantul.j
End If
End If
Next
Else
'==========================
'non aktifkan bumerang yang
'tidak di dalam game screen
'==========================
Bumerang(i).GO_Active = False
End If
End If
If Bumerang(i).GO_Active Then
GL.Enable(EnableCap.Blend)
GL.BlendFunc(BlendingFactorSrc.DstColor, BlendingFactorDest.Zero)
'Mask
GL.BindTexture(TextureTarget.Texture2D, BumerangBMP_Mask)
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Bumerang(i).Ax, Bumerang(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Bumerang(i).Bx, Bumerang(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Bumerang(i).Cx, Bumerang(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Bumerang(i).Dx, Bumerang(i).Dy)
GL.End()
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One)
'BMP
GL.BindTexture(TextureTarget.Texture2D, BumerangBMP)
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Bumerang(i).Ax, Bumerang(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Bumerang(i).Bx, Bumerang(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Bumerang(i).Cx, Bumerang(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Bumerang(i).Dx, Bumerang(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(Bumerang(i).Ax, Bumerang(i).Ay)
GL.Vertex2(Bumerang(i).Bx, Bumerang(i).By)
GL.Vertex2(Bumerang(i).Cx, Bumerang(i).Cy)
GL.Vertex2(Bumerang(i).Dx, Bumerang(i).Dy)
GL.End()
End If
'rotasi bumerang
Rotasi(Bumerang(i).Ax, Bumerang(i).Ay, CenterX_Bumerang, CenterY_Bumerang, 30.5)
Rotasi(Bumerang(i).Bx, Bumerang(i).By, CenterX_Bumerang, CenterY_Bumerang, 30.5)
Rotasi(Bumerang(i).Cx, Bumerang(i).Cy, CenterX_Bumerang, CenterY_Bumerang, 30.5)
Rotasi(Bumerang(i).Dx, Bumerang(i).Dy, CenterX_Bumerang, CenterY_Bumerang, 30.5)
'translasi bumerang dengan vektor-nya
Bumerang(i).Ax = Bumerang(i).Ax + Bumerang(i).Vektor.i
Bumerang(i).Bx = Bumerang(i).Bx + Bumerang(i).Vektor.i
Bumerang(i).Cx = Bumerang(i).Cx + Bumerang(i).Vektor.i
Bumerang(i).Dx = Bumerang(i).Dx + Bumerang(i).Vektor.i
Bumerang(i).Ay = Bumerang(i).Ay + Bumerang(i).Vektor.j
Bumerang(i).By = Bumerang(i).By + Bumerang(i).Vektor.j
Bumerang(i).Cy = Bumerang(i).Cy + Bumerang(i).Vektor.j
Bumerang(i).Dy = Bumerang(i).Dy + Bumerang(i).Vektor.j
End If
Next
End Sub
Update 1 Jan 2016
Contoh lain matematika vektor yang sangat berguna untuk pemrograman game, Sudut Vektor, Membuat Missile dan Tanjakan Turunan.
Ok rekan-rekan sekalian, selesai sudah bacaan tentang vektor pantul dan sekali lagi sang vektor membuktikan dirinya emang berkualitas untuk menyelesaikan permasalahan di game programming.
Salam matematika vektor
Heriady
heriady.yoh@gmail.com
Artikel terkait
Mendeteksi Posisi dengan Vektor Proyeksi
|
|
Animasi dengan Translasi dan Rotasi
|
|
Deteksi Tabrakan dengan Proyeksi Vektor
|
|
Vektor R2
|
Tidak ada komentar:
Posting Komentar