Pagi rekan-rekan sekalian, bagaimana keadaan kalian sehat semua...? Sebentar lagi Idul Fitri...tak terasa ya...
Bahan pembicaraan kali ini adalah translasi dengan vektor (masih ingat kan sama abang Victor), pada artikel sebelumnya ogut pernah bercerita tentang translasi dengan menggunakan vektor, kali ini topiknya sama hanya penerapannya berbeda.
Pada gambar di bawah Anda dapat melihat beberapa objek pesawat musuh yang bergerak sesuai dengan perintah yang diberikan kepada objek tersebut.
Di contoh program terdahulu pesawat Fighter di kontrol oleh user (game player) untuk bergerak ke arah yang dikehendaki. Untuk program kali ini terjadi sebaliknya, objek musuh tidak di kontrol oleh game player tetapi musuh kita program agar bergerak sesuai dengan keinginan kita sebagai programmer.
Untuk mengatur arah gerakan musuh digunakan vektor 8 arah seperti vektor translasi pesawat.
Dengan vektor 8 arah maka sebuah musuh bisa diberi perintah “C100I050G100”, artinya musuh bergerak ke arah C(timur) sebanyak 100 langkah lalu I(diam di tempat) selama 50 langkah dan bergerak ke arah G(barat) sebanyak 100 langkah.
Bila program dijalankan Anda akan melihat tiga buah musuh yang bergerak dengan arah yang berbeda-beda. Trik seperti ini banyak dipakai untuk membuat game bertipe shoot them up seperti Mustang dan Raiden.
Untuk memudahkan Anda memahami cara menggerakkan objek musuh berikut ini ogut sertakan bagian kode program yang penting, source code lengkap dapat Anda download di link yang telah ogut sediakan.
Tentukan nilai awal untuk masing-masing Enemy.
Private Sub SettingNilaiAwal()
'Enemy(0)
Enemy(0).Ax = -840 : Enemy(0).Ay = 200
Enemy(0).Bx = -680 : Enemy(0).By = 200
Enemy(0).Cx = -680 : Enemy(0).Cy = 360
Enemy(0).Dx = -840 : Enemy(0).Dy = 360
Enemy(0).StringMovement = "C130I050B070G170F070C040"
Enemy(0).Index_SM = 0
Enemy(0).Total_SM = Len(Enemy(0).StringMovement) / 4
Enemy(0).AksiObjek = ""
Enemy(0).Max_AO = 0
Enemy(0).Counter_AO = 0
'Enemy(1)
Enemy(1).Ax = -890 : Enemy(1).Ay = 100
Enemy(1).Bx = -730 : Enemy(1).By = 100
Enemy(1).Cx = -730 : Enemy(1).Cy = 260
Enemy(1).Dx = -890 : Enemy(1).Dy = 260
Enemy(1).StringMovement = "C130I050C050I100G180I020"
Enemy(1).Index_SM = 0
Enemy(1).Total_SM = Len(Enemy(1).StringMovement) / 4
Enemy(1).AksiObjek = ""
Enemy(1).Max_AO = 0
Enemy(1).Counter_AO = 0
'Enemy(2)
Enemy(2).Ax = -940 : Enemy(2).Ay = 0
Enemy(2).Bx = -780 : Enemy(2).By = 0
Enemy(2).Cx = -780 : Enemy(2).Cy = 160
Enemy(2).Dx = -940 : Enemy(2).Dy = 160
Enemy(2).StringMovement = "C130I050F050G130B050I120"
Enemy(2).Index_SM = 0
Enemy(2).Total_SM = Len(Enemy(2).StringMovement) / 4
Enemy(2).AksiObjek = ""
Enemy(2).Max_AO = 0
Enemy(2).Counter_AO = 0
Indeks_Tekstur_Enemy = 2
Enemy_Speed = 5.5
'================================
'cos 45 = 0.7071, sin 45 = 0.7071
'
'buat 8 buah vektor arah
'================================
'arah utara(A)
Vektor_8Arah(0).i = 0 : Vektor_8Arah(0).j = Enemy_Speed
'arah timur laut(B)
Vektor_8Arah(1).i = Enemy_Speed * 0.7071
Vektor_8Arah(1).j = Enemy_Speed * 0.7071
'arah timur(C)
Vektor_8Arah(2).i = Enemy_Speed : Vektor_8Arah(2).j = 0
'arah tenggara(D)
Vektor_8Arah(3).i = Enemy_Speed * 0.7071
Vektor_8Arah(3).j = -Enemy_Speed * 0.7071
'arah selatan(E)
Vektor_8Arah(4).i = 0 : Vektor_8Arah(4).j = -Enemy_Speed
'arah barat daya(F)
Vektor_8Arah(5).i = -Enemy_Speed * 0.7071
Vektor_8Arah(5).j = -Enemy_Speed * 0.7071
'arah barat(G)
Vektor_8Arah(6).i = -Enemy_Speed : Vektor_8Arah(6).j = 0
'arah barat laut(H)
Vektor_8Arah(7).i = -Enemy_Speed * 0.7071
Vektor_8Arah(7).j = Enemy_Speed * 0.7071
End Sub
Menggerakkan Enemy sesuai dengan String Movement yang diberikan.
Private Sub Menggerakkan_Enemy(ByVal Indeks_Enemy As Integer)
Dim TempString1 As String
Dim Steps As Integer
If Enemy(Indeks_Enemy).Counter_AO = 0 Then
Enemy(Indeks_Enemy).Index_SM = Enemy(Indeks_Enemy).Index_SM + 1
If Enemy(Indeks_Enemy).Index_SM > Enemy(Indeks_Enemy).Total_SM Then
Enemy(Indeks_Enemy).Index_SM = 1
End If
'get AksiObjek+MaxAO, contoh "A030"
Steps = 1 + (Enemy(Indeks_Enemy).Index_SM - 1) * 4
TempString1 = Mid(Enemy(Indeks_Enemy).StringMovement, Steps, 4)
'get AksiObjek
Enemy(Indeks_Enemy).AksiObjek = Microsoft.VisualBasic.Left(TempString1, 1)
'get MaxAO
Enemy(Indeks_Enemy).Max_AO = Val(Microsoft.VisualBasic.Right(TempString1, 3))
Enemy(Indeks_Enemy).Counter_AO = Enemy(Indeks_Enemy).Counter_AO + 1
End If
'=====================================
'translasi Enemy sesuai dengan arahnya
'=====================================
'utara
If Enemy(Indeks_Enemy).AksiObjek = "A" Then
Translasi_Enemy(Indeks_Enemy, 0)
End If
'timur laut(sudut 45)
If Enemy(Indeks_Enemy).AksiObjek = "B" Then
Translasi_Enemy(Indeks_Enemy, 1)
End If
'timur
If Enemy(Indeks_Enemy).AksiObjek = "C" Then
Translasi_Enemy(Indeks_Enemy, 2)
End If
'tenggara(sudut 45)
If Enemy(Indeks_Enemy).AksiObjek = "D" Then
Translasi_Enemy(Indeks_Enemy, 3)
End If
'selatan
If Enemy(Indeks_Enemy).AksiObjek = "E" Then
Translasi_Enemy(Indeks_Enemy, 4)
End If
'barat daya(sudut 45)
If Enemy(Indeks_Enemy).AksiObjek = "F" Then
Translasi_Enemy(Indeks_Enemy, 5)
End If
'barat
If Enemy(Indeks_Enemy).AksiObjek = "G" Then
Translasi_Enemy(Indeks_Enemy, 6)
End If
'barat laut(sudut 45)
If Enemy(Indeks_Enemy).AksiObjek = "H" Then
Translasi_Enemy(Indeks_Enemy, 7)
End If
Enemy(Indeks_Enemy).Counter_AO = Enemy(Indeks_Enemy).Counter_AO + 1
If Enemy(Indeks_Enemy).Counter_AO > Enemy(Indeks_Enemy).Max_AO Then
Enemy(Indeks_Enemy).Counter_AO = 0
End If
End Sub
Private Sub Translasi_Enemy(ByVal Indeks_Enemy As Integer, ByVal Index_Vektor As Integer)
Enemy(Indeks_Enemy).Ax = Enemy(Indeks_Enemy).Ax + Vektor_8Arah(Index_Vektor).i
Enemy(Indeks_Enemy).Bx = Enemy(Indeks_Enemy).Bx + Vektor_8Arah(Index_Vektor).i
Enemy(Indeks_Enemy).Cx = Enemy(Indeks_Enemy).Cx + Vektor_8Arah(Index_Vektor).i
Enemy(Indeks_Enemy).Dx = Enemy(Indeks_Enemy).Dx + Vektor_8Arah(Index_Vektor).i
Enemy(Indeks_Enemy).Ay = Enemy(Indeks_Enemy).Ay + Vektor_8Arah(Index_Vektor).j
Enemy(Indeks_Enemy).By = Enemy(Indeks_Enemy).By + Vektor_8Arah(Index_Vektor).j
Enemy(Indeks_Enemy).Cy = Enemy(Indeks_Enemy).Cy + Vektor_8Arah(Index_Vektor).j
Enemy(Indeks_Enemy).Dy = Enemy(Indeks_Enemy).Dy + Vektor_8Arah(Index_Vektor).j
End Sub
Render Enemy.
Private Sub Render_Enemy()
'membuat animasi enemy oleng kiri-kanan
Delay_Tekstur_Enemy = Delay_Tekstur_Enemy + 1
If Delay_Tekstur_Enemy > 8 Then
Delay_Tekstur_Enemy = 1
If Plus_Indeks_Tekstur_Enemy = True Then
'plus
Indeks_Tekstur_Enemy = Indeks_Tekstur_Enemy + 1
If Indeks_Tekstur_Enemy > 2 Then
Indeks_Tekstur_Enemy = 1
Plus_Indeks_Tekstur_Enemy = False
End If
Else
'minus
Indeks_Tekstur_Enemy = Indeks_Tekstur_Enemy - 1
If Indeks_Tekstur_Enemy = -1 Then
Indeks_Tekstur_Enemy = 1
Plus_Indeks_Tekstur_Enemy = True
End If
End If
End If
Dim i As Integer
For i = 0 To 2
Menggerakkan_Enemy(i)
GL.Enable(EnableCap.Blend)
GL.BlendFunc(BlendingFactorSrc.DstColor, BlendingFactorDest.Zero)
GL.BindTexture(TextureTarget.Texture2D, EnemyBMP_Mask(Indeks_Tekstur_Enemy))
'mask
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Enemy(i).Ax, Enemy(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Enemy(i).Bx, Enemy(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Enemy(i).Cx, Enemy(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Enemy(i).Dx, Enemy(i).Dy)
GL.End()
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One)
GL.BindTexture(TextureTarget.Texture2D, EnemyBMP(Indeks_Tekstur_Enemy))
'tekstur
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Enemy(i).Ax, Enemy(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Enemy(i).Bx, Enemy(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Enemy(i).Cx, Enemy(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Enemy(i).Dx, Enemy(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(Enemy(i).Ax, Enemy(i).Ay) 'titik kiri bawah
GL.Vertex2(Enemy(i).Bx, Enemy(i).By) 'titik kanan bawah
GL.Vertex2(Enemy(i).Cx, Enemy(i).Cy) 'titik kanan atas
GL.Vertex2(Enemy(i).Dx, Enemy(i).Dy) 'titik kiri atas
GL.End()
End If
Next
End Sub
Terima kasih rekan-rekan atas perhatiannya untuk membaca artikel ini, teknik pada artikel ini ogut pakai untuk membuat game engine dan game shoot them up. Keduanya sudah pernah ogut tulis artikelnya.
Salam
Heriady
heriady.yoh@gmail.com
Artikel terkait
'Enemy(0)
Enemy(0).Ax = -840 : Enemy(0).Ay = 200
Enemy(0).Bx = -680 : Enemy(0).By = 200
Enemy(0).Cx = -680 : Enemy(0).Cy = 360
Enemy(0).Dx = -840 : Enemy(0).Dy = 360
Enemy(0).StringMovement = "C130I050B070G170F070C040"
Enemy(0).Index_SM = 0
Enemy(0).Total_SM = Len(Enemy(0).StringMovement) / 4
Enemy(0).AksiObjek = ""
Enemy(0).Max_AO = 0
Enemy(0).Counter_AO = 0
'Enemy(1)
Enemy(1).Ax = -890 : Enemy(1).Ay = 100
Enemy(1).Bx = -730 : Enemy(1).By = 100
Enemy(1).Cx = -730 : Enemy(1).Cy = 260
Enemy(1).Dx = -890 : Enemy(1).Dy = 260
Enemy(1).StringMovement = "C130I050C050I100G180I020"
Enemy(1).Index_SM = 0
Enemy(1).Total_SM = Len(Enemy(1).StringMovement) / 4
Enemy(1).AksiObjek = ""
Enemy(1).Max_AO = 0
Enemy(1).Counter_AO = 0
'Enemy(2)
Enemy(2).Ax = -940 : Enemy(2).Ay = 0
Enemy(2).Bx = -780 : Enemy(2).By = 0
Enemy(2).Cx = -780 : Enemy(2).Cy = 160
Enemy(2).Dx = -940 : Enemy(2).Dy = 160
Enemy(2).StringMovement = "C130I050F050G130B050I120"
Enemy(2).Index_SM = 0
Enemy(2).Total_SM = Len(Enemy(2).StringMovement) / 4
Enemy(2).AksiObjek = ""
Enemy(2).Max_AO = 0
Enemy(2).Counter_AO = 0
Indeks_Tekstur_Enemy = 2
Enemy_Speed = 5.5
'================================
'cos 45 = 0.7071, sin 45 = 0.7071
'
'buat 8 buah vektor arah
'================================
'arah utara(A)
Vektor_8Arah(0).i = 0 : Vektor_8Arah(0).j = Enemy_Speed
'arah timur laut(B)
Vektor_8Arah(1).i = Enemy_Speed * 0.7071
Vektor_8Arah(1).j = Enemy_Speed * 0.7071
'arah timur(C)
Vektor_8Arah(2).i = Enemy_Speed : Vektor_8Arah(2).j = 0
'arah tenggara(D)
Vektor_8Arah(3).i = Enemy_Speed * 0.7071
Vektor_8Arah(3).j = -Enemy_Speed * 0.7071
'arah selatan(E)
Vektor_8Arah(4).i = 0 : Vektor_8Arah(4).j = -Enemy_Speed
'arah barat daya(F)
Vektor_8Arah(5).i = -Enemy_Speed * 0.7071
Vektor_8Arah(5).j = -Enemy_Speed * 0.7071
'arah barat(G)
Vektor_8Arah(6).i = -Enemy_Speed : Vektor_8Arah(6).j = 0
'arah barat laut(H)
Vektor_8Arah(7).i = -Enemy_Speed * 0.7071
Vektor_8Arah(7).j = Enemy_Speed * 0.7071
End Sub
Menggerakkan Enemy sesuai dengan String Movement yang diberikan.
Private Sub Menggerakkan_Enemy(ByVal Indeks_Enemy As Integer)
Dim TempString1 As String
Dim Steps As Integer
If Enemy(Indeks_Enemy).Counter_AO = 0 Then
Enemy(Indeks_Enemy).Index_SM = Enemy(Indeks_Enemy).Index_SM + 1
If Enemy(Indeks_Enemy).Index_SM > Enemy(Indeks_Enemy).Total_SM Then
Enemy(Indeks_Enemy).Index_SM = 1
End If
'get AksiObjek+MaxAO, contoh "A030"
Steps = 1 + (Enemy(Indeks_Enemy).Index_SM - 1) * 4
TempString1 = Mid(Enemy(Indeks_Enemy).StringMovement, Steps, 4)
'get AksiObjek
Enemy(Indeks_Enemy).AksiObjek = Microsoft.VisualBasic.Left(TempString1, 1)
'get MaxAO
Enemy(Indeks_Enemy).Max_AO = Val(Microsoft.VisualBasic.Right(TempString1, 3))
Enemy(Indeks_Enemy).Counter_AO = Enemy(Indeks_Enemy).Counter_AO + 1
End If
'=====================================
'translasi Enemy sesuai dengan arahnya
'=====================================
'utara
If Enemy(Indeks_Enemy).AksiObjek = "A" Then
Translasi_Enemy(Indeks_Enemy, 0)
End If
'timur laut(sudut 45)
If Enemy(Indeks_Enemy).AksiObjek = "B" Then
Translasi_Enemy(Indeks_Enemy, 1)
End If
'timur
If Enemy(Indeks_Enemy).AksiObjek = "C" Then
Translasi_Enemy(Indeks_Enemy, 2)
End If
'tenggara(sudut 45)
If Enemy(Indeks_Enemy).AksiObjek = "D" Then
Translasi_Enemy(Indeks_Enemy, 3)
End If
'selatan
If Enemy(Indeks_Enemy).AksiObjek = "E" Then
Translasi_Enemy(Indeks_Enemy, 4)
End If
'barat daya(sudut 45)
If Enemy(Indeks_Enemy).AksiObjek = "F" Then
Translasi_Enemy(Indeks_Enemy, 5)
End If
'barat
If Enemy(Indeks_Enemy).AksiObjek = "G" Then
Translasi_Enemy(Indeks_Enemy, 6)
End If
'barat laut(sudut 45)
If Enemy(Indeks_Enemy).AksiObjek = "H" Then
Translasi_Enemy(Indeks_Enemy, 7)
End If
Enemy(Indeks_Enemy).Counter_AO = Enemy(Indeks_Enemy).Counter_AO + 1
If Enemy(Indeks_Enemy).Counter_AO > Enemy(Indeks_Enemy).Max_AO Then
Enemy(Indeks_Enemy).Counter_AO = 0
End If
End Sub
Private Sub Translasi_Enemy(ByVal Indeks_Enemy As Integer, ByVal Index_Vektor As Integer)
Enemy(Indeks_Enemy).Ax = Enemy(Indeks_Enemy).Ax + Vektor_8Arah(Index_Vektor).i
Enemy(Indeks_Enemy).Bx = Enemy(Indeks_Enemy).Bx + Vektor_8Arah(Index_Vektor).i
Enemy(Indeks_Enemy).Cx = Enemy(Indeks_Enemy).Cx + Vektor_8Arah(Index_Vektor).i
Enemy(Indeks_Enemy).Dx = Enemy(Indeks_Enemy).Dx + Vektor_8Arah(Index_Vektor).i
Enemy(Indeks_Enemy).Ay = Enemy(Indeks_Enemy).Ay + Vektor_8Arah(Index_Vektor).j
Enemy(Indeks_Enemy).By = Enemy(Indeks_Enemy).By + Vektor_8Arah(Index_Vektor).j
Enemy(Indeks_Enemy).Cy = Enemy(Indeks_Enemy).Cy + Vektor_8Arah(Index_Vektor).j
Enemy(Indeks_Enemy).Dy = Enemy(Indeks_Enemy).Dy + Vektor_8Arah(Index_Vektor).j
End Sub
Render Enemy.
Private Sub Render_Enemy()
'membuat animasi enemy oleng kiri-kanan
Delay_Tekstur_Enemy = Delay_Tekstur_Enemy + 1
If Delay_Tekstur_Enemy > 8 Then
Delay_Tekstur_Enemy = 1
If Plus_Indeks_Tekstur_Enemy = True Then
'plus
Indeks_Tekstur_Enemy = Indeks_Tekstur_Enemy + 1
If Indeks_Tekstur_Enemy > 2 Then
Indeks_Tekstur_Enemy = 1
Plus_Indeks_Tekstur_Enemy = False
End If
Else
'minus
Indeks_Tekstur_Enemy = Indeks_Tekstur_Enemy - 1
If Indeks_Tekstur_Enemy = -1 Then
Indeks_Tekstur_Enemy = 1
Plus_Indeks_Tekstur_Enemy = True
End If
End If
End If
Dim i As Integer
For i = 0 To 2
Menggerakkan_Enemy(i)
GL.Enable(EnableCap.Blend)
GL.BlendFunc(BlendingFactorSrc.DstColor, BlendingFactorDest.Zero)
GL.BindTexture(TextureTarget.Texture2D, EnemyBMP_Mask(Indeks_Tekstur_Enemy))
'mask
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Enemy(i).Ax, Enemy(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Enemy(i).Bx, Enemy(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Enemy(i).Cx, Enemy(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Enemy(i).Dx, Enemy(i).Dy)
GL.End()
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One)
GL.BindTexture(TextureTarget.Texture2D, EnemyBMP(Indeks_Tekstur_Enemy))
'tekstur
GL.Begin(BeginMode.Quads)
GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Enemy(i).Ax, Enemy(i).Ay)
GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Enemy(i).Bx, Enemy(i).By)
GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Enemy(i).Cx, Enemy(i).Cy)
GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Enemy(i).Dx, Enemy(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(Enemy(i).Ax, Enemy(i).Ay) 'titik kiri bawah
GL.Vertex2(Enemy(i).Bx, Enemy(i).By) 'titik kanan bawah
GL.Vertex2(Enemy(i).Cx, Enemy(i).Cy) 'titik kanan atas
GL.Vertex2(Enemy(i).Dx, Enemy(i).Dy) 'titik kiri atas
GL.End()
End If
Next
End Sub
Terima kasih rekan-rekan atas perhatiannya untuk membaca artikel ini, teknik pada artikel ini ogut pakai untuk membuat game engine dan game shoot them up. Keduanya sudah pernah ogut tulis artikelnya.
Salam
Heriady
heriady.yoh@gmail.com
Artikel terkait
Membuat Game Engine Sendiri dengan Visual C++
|
|
Animasi Game 2D dengan Translasi
|
|
Deteksi Tabrakan dengan Proyeksi Vektor
|
|
Membuat Game Shoot Them Up dengan Visual C++
|
Tidak ada komentar:
Posting Komentar