Minggu, 12 Juli 2015

Animasi dengan Vektor Translasi 2

Di suatu pagi hari yang cerah, setelah urusan buat event banner di Plataran selesai saatnya nge-blog lagi.


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

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++