Tampilkan postingan dengan label OpenTK 2D. Tampilkan semua postingan
Tampilkan postingan dengan label OpenTK 2D. Tampilkan semua postingan

Senin, 20 Juli 2015

Teori Enam Kondisi untuk Membuat Side Scrolling Game

Pagi yang indah, masih dalam suasana lebaran, nikmatnya bersilaturahmi...


Selamat pagi rekan-rekan, pada pagi ini ogut akan memperkenalkan game side scrolling dan teknik dasar cara membuatnya. Contoh side scrolling game yang menjadi legenda sampai saat ini adalah game Super Mario Bross dan game Sonic the Hedgehog, walaupun game tersebut telah berumur lebih dari dua puluh tahun tetapi namanya masih terdengar hingga detik ini.

Sampai saat ini game bertipe side scrolling masih dibuat dan masih banyak digemari, dengan alasan inilah ogut menulis artikel ini agar rekan-rekan bisa belajar membuat game bertipe side scrolling.


Teori Enam Kondisi
Ada satu ciri yang menjadi keunikan pada game-game yang bertipe side scrolling, tokoh game dapat berpindah-pindah posisi dengan cara melompat ke atas pijakan tertentu.

Contoh Game Darfo (klik disini untuk menuju ke artikelnya)



Untuk dapat membuat game seperti ini dibutuhkan trik khusus pada proses deteksi tabrakan tokoh game dengan poligon-poligon yang menjadi tempat berpijak.

Berikut ini ogut akan memberikan enam kondisi yang dapat digunakan untuk mendeteksi posisi tokoh game agar sang tokoh dapat melompat berpindah-pindah tempat.

Kondisi I
Kondisi ini terjadi pada saat tokoh game berjalan ke kiri dan menabrak poligon yang digunakan sebagai kotak pembatas(KP) di sisi sebelah kanan.


Dua titik koordinat yang digunakan untuk mendeteksi tabrakan adalah titik kiri atas dan titik kiri bawah poligon tokoh.


Kondisi II
Kondisi ini akan terjadi bila tokoh game melompat dan mendarat di atas sebuah kotak pembatas(pijakan).


Titik koordinat yang digunakan untuk mendeteksi kondisi ini adalah titik kiri bawah poligon tokoh dan titik horisontal 2 (h2).


Kondisi III
Kondisi yang terjadi bila tokoh game berada di atas kotak pembatas dan bergerak ke kanan.


Untuk mendeteksi kondisi ini dibutuhkan dua buah vektor bantu.


Kondisi IV
Kondisi ini sama dengan kondisi I tetapi tokoh game menabrak kotak pembatas di sisi sebelah kiri.


Dua titik koordinat yang digunakan untuk mendeteksi tabrakan adalah titik kanan atas dan titik kanan bawah poligon tokoh.


Kondisi V
Kondisi yang sama dengan kondisi II tetapi terjadi di sebelah kiri kotak pembatas.


Untuk mendeteksi kondisi V digunakan titik koordinat kanan bawah poligon tokoh dan titik horisontal 3 (h3).


Kondisi VI
Kondisi ini terjadi bila tokoh game berada di atas kotak pembatas dan bergerak ke kiri.


Sama seperti kondisi III, kondisi VI memerlukan dua buah vektor bantu agar tokoh game bisa terjun ke arah sebelah kiri kotak pembatas.


Implementasi Enam Kondisi
Program implementasi yang ogut sertakan pada artikel ini juga menggunakan skala proyeksi vektor untuk mendeteksi tabrakan.

Setelah program dijalankan Anda dapat menggerakkan tokoh Alien untuk melompat-lompat berpindah posisi dari satu pijakan ke pijakan yang lain.

Berikut ini ogut sertakan kode program yang penting untuk program side scrolling game (Alien), berkreasilah tanpa mengenal batas dan jangan pernah dibatasi oleh waktu dan ruang jika berkarya. Source code lengkap dapat Anda download di link yang telah disediakan.

Tentukan nilai awal untuk Alien dan Kotak Pembatas.

    Public Sub SettingNilaiAwal()
        'Alien
        Alien.Ax = -95 : Alien.Ay = -350
        Alien.Bx = 95 : Alien.By = -350
        Alien.Cx = 95 : Alien.Cy = -100
        Alien.Dx = -95 : Alien.Dy = -100

        Alien.GeserX = 9.5
        Alien.GeserY = 9.5
        '===================
        'nilai status alien
        '1 = di atas poligon
        '3 = lompat
        '4 = terjun
        '===================
        Alien.Status = 4

        Alien_Lompat = 0
        Alien_Terjun = 0
        MaxAlien_Lompat = 22
        MaxAlien_Terjun = 90
        Terjun_Ketinggian = 45
        Red_Alien = False

        Indeks_Tekstur_Alien = 0

        'Roda kiri
        Roda(0).Ax = -70 : Roda(0).Ay = -370
        Roda(0).Bx = -30 : Roda(0).By = -370
        Roda(0).Cx = -30 : Roda(0).Cy = -330
        Roda(0).Dx = -70 : Roda(0).Dy = -330

        'Roda tengah
        Roda(1).Ax = -20 : Roda(1).Ay = -370
        Roda(1).Bx = 20 : Roda(1).By = -370
        Roda(1).Cx = 20 : Roda(1).Cy = -330
        Roda(1).Dx = -20 : Roda(1).Dy = -330

        'Roda kanan
        Roda(2).Ax = 30 : Roda(2).Ay = -370
        Roda(2).Bx = 70 : Roda(2).By = -370
        Roda(2).Cx = 70 : Roda(2).Cy = -330
        Roda(2).Dx = 30 : Roda(2).Dy = -330

        Total_KP = 6
        ReDim KotakPembatas(0 To Total_KP - 1)

        'KotakPembatas(0), vertikal kiri
        KotakPembatas(0).Ax = -700
        KotakPembatas(0).Ay = -400
        KotakPembatas(0).Bx = -600
        KotakPembatas(0).By = KotakPembatas(0).Ay
        KotakPembatas(0).Cx = KotakPembatas(0).Bx
        KotakPembatas(0).Cy = 480
        KotakPembatas(0).Dx = KotakPembatas(0).Ax
        KotakPembatas(0).Dy = KotakPembatas(0).Cy

        'KotakPembatas(1), mendatar terbawah
        KotakPembatas(1).Ax = -600
        KotakPembatas(1).Ay = -480
        KotakPembatas(1).Bx = 600
        KotakPembatas(1).By = KotakPembatas(1).Ay
        KotakPembatas(1).Cx = KotakPembatas(1).Bx
        KotakPembatas(1).Cy = -400
        KotakPembatas(1).Dx = KotakPembatas(1).Ax
        KotakPembatas(1).Dy = KotakPembatas(1).Cy

        'KotakPembatas(2), vertikal kanan
        KotakPembatas(2).Ax = 600
        KotakPembatas(2).Ay = -400
        KotakPembatas(2).Bx = 700
        KotakPembatas(2).By = KotakPembatas(2).Ay
        KotakPembatas(2).Cx = KotakPembatas(2).Bx
        KotakPembatas(2).Cy = 480
        KotakPembatas(2).Dx = KotakPembatas(2).Ax
        KotakPembatas(2).Dy = KotakPembatas(2).Cy

        'KotakPembatas(3), pijakan pertama
        KotakPembatas(3).Ax = -380
        KotakPembatas(3).Ay = -280
        KotakPembatas(3).Bx = -180
        KotakPembatas(3).By = KotakPembatas(3).Ay
        KotakPembatas(3).Cx = KotakPembatas(3).Bx
        KotakPembatas(3).Cy = -230
        KotakPembatas(3).Dx = KotakPembatas(3).Ax
        KotakPembatas(3).Dy = KotakPembatas(3).Cy

        'KotakPembatas(4), pijakan kedua
        KotakPembatas(4).Ax = -50
        KotakPembatas(4).Ay = -160
        KotakPembatas(4).Bx = 170
        KotakPembatas(4).By = KotakPembatas(4).Ay
        KotakPembatas(4).Cx = KotakPembatas(4).Bx
        KotakPembatas(4).Cy = -110
        KotakPembatas(4).Dx = KotakPembatas(4).Ax
        KotakPembatas(4).Dy = KotakPembatas(4).Cy

        'KotakPembatas(5), pijakan ketiga
        KotakPembatas(5).Ax = 50
        KotakPembatas(5).Ay = -10
        KotakPembatas(5).Bx = 270
        KotakPembatas(5).By = KotakPembatas(5).Ay
        KotakPembatas(5).Cx = KotakPembatas(5).Bx
        KotakPembatas(5).Cy = 40
        KotakPembatas(5).Dx = KotakPembatas(5).Ax
        KotakPembatas(5).Dy = KotakPembatas(5).Cy
    End Sub

Deteksi tombol keyboard yang ditekan user.

    Private Sub Tekan_Keyboard()
        NilaiKey = 0
        Indeks_Tekstur_Alien = 0
        Sudut_Putar_Roda = 0

        'kiri
        If (GetKeyState(Keys.J) And &H1000) Then
            NilaiKey = NilaiKey + 10000
        End If
        'kanan
        If (GetKeyState(Keys.L) And &H1000) Then
            NilaiKey = NilaiKey + 20000
        End If
        'lompat("B" ditekan)
        If (GetKeyState(Keys.B) And &H1000) And (Alien.Status = 1) Then
            NilaiKey = NilaiKey + 1000
        End If

        'jika alien sedang melompat atau terjun
        If Alien.Status = 3 Then
            NilaiKey = NilaiKey + 1000
        End If
        If Alien.Status = 4 Then
            NilaiKey = NilaiKey + 2000
        End If

        'alien ke kiri saja
        If (NilaiKey = 10000) And (Alien.Status = 1) Then
            Sudut_Putar_Roda = 9.5
            Geser_Alien_KeKiri()
        End If
        'alien ke kanan saja
        If (NilaiKey = 20000) And (Alien.Status = 1) Then
            Sudut_Putar_Roda = -9.5
            Geser_Alien_KeKanan()
        End If
        'lompat saja
        If NilaiKey = 1000 Then
            Alien.Status = 3
            Alien_Lompat_KeAtas()
            Indeks_Tekstur_Alien = 1
        End If
        'terjun saja
        If NilaiKey = 2000 Then
            Alien_Terjun_KeBawah()
        End If

        'kombinasi kiri+lompat
        If (NilaiKey = 11000) And (Alien.Status = 1) Then
            Alien.Status = 3
            Alien_Lompat_KeAtas()
            Geser_Alien_KeKiri()
            Indeks_Tekstur_Alien = 1
        End If
        'sedang lompat+kiri
        If (NilaiKey = 11000) And (Alien.Status = 3) Then
            Alien_Lompat_KeAtas()
            Geser_Alien_KeKiri()
            Indeks_Tekstur_Alien = 1
            Sudut_Putar_Roda = 29.5
        End If
        'sedang terjun+kiri
        If (NilaiKey = 12000) And (Alien.Status = 4) Then
            Alien_Terjun_KeBawah()
            Geser_Alien_KeKiri()
            Sudut_Putar_Roda = 29.5
        End If

        'kombinasi kanan+lompat
        If (NilaiKey = 21000) And (Alien.Status = 1) Then
            Alien.Status = 3
            Alien_Lompat_KeAtas()
            Geser_Alien_KeKanan()
            Indeks_Tekstur_Alien = 1
            Sudut_Putar_Roda = -29.5
        End If
        'sedang lompat+kanan
        If (NilaiKey = 21000) And (Alien.Status = 3) Then
            Alien_Lompat_KeAtas()
            Geser_Alien_KeKanan()
            Indeks_Tekstur_Alien = 1
            Sudut_Putar_Roda = -29.5
        End If
        'sedang terjun+kanan
        If (NilaiKey = 22000) And (Alien.Status = 4) Then
            Alien_Terjun_KeBawah()
            Geser_Alien_KeKanan()
            Sudut_Putar_Roda = -29.5
        End If

    End Sub

Gerakkan Alien sesuai dengan tombol yang ditekan user.

    '========================================
    'copy posisi alien untuk deteksi tabrakan
    '========================================
    Private Sub Sub_Copy_Alien()
        Copy_Alien.Ax = Alien.Ax : Copy_Alien.Ay = Alien.Ay
        Copy_Alien.Bx = Alien.Bx : Copy_Alien.By = Alien.By
        Copy_Alien.Cx = Alien.Cx : Copy_Alien.Cy = Alien.Cy
        Copy_Alien.Dx = Alien.Dx : Copy_Alien.Dy = Alien.Dy

        Copy_Alien.Status = Alien.Status
    End Sub

    Private Sub Geser_Alien_KeKiri()
        Dim i As Integer
        Dim GeserX_Var As Single

        If (Alien.Status = 3 Or Alien.Status = 4) Then
            GeserX_Var = Alien.GeserX * 0.65
        Else
            GeserX_Var = Alien.GeserX
        End If

        Alien.Ax = Alien.Ax - GeserX_Var
        Alien.Bx = Alien.Bx - GeserX_Var
        Alien.Cx = Alien.Cx - GeserX_Var
        Alien.Dx = Alien.Dx - GeserX_Var
        For i = 0 To 2
            Roda(i).Ax = Roda(i).Ax - GeserX_Var
            Roda(i).Bx = Roda(i).Bx - GeserX_Var
            Roda(i).Cx = Roda(i).Cx - GeserX_Var
            Roda(i).Dx = Roda(i).Dx - GeserX_Var
        Next
    End Sub

    Private Sub Geser_Alien_KeKanan()
        Dim i As Integer
        Dim GeserX_Var As Single

        If (Alien.Status = 3 Or Alien.Status = 4) Then
            GeserX_Var = Alien.GeserX * 0.65
        Else
            GeserX_Var = Alien.GeserX
        End If

        Alien.Ax = Alien.Ax + GeserX_Var
        Alien.Bx = Alien.Bx + GeserX_Var
        Alien.Cx = Alien.Cx + GeserX_Var
        Alien.Dx = Alien.Dx + GeserX_Var
        For i = 0 To 2
            Roda(i).Ax = Roda(i).Ax + GeserX_Var
            Roda(i).Bx = Roda(i).Bx + GeserX_Var
            Roda(i).Cx = Roda(i).Cx + GeserX_Var
            Roda(i).Dx = Roda(i).Dx + GeserX_Var
        Next
    End Sub

    Private Sub Geser_Alien_KeAtas()
        Dim i As Integer

        Alien.Ay = Alien.Ay + Alien.GeserY
        Alien.By = Alien.By + Alien.GeserY
        Alien.Cy = Alien.Cy + Alien.GeserY
        Alien.Dy = Alien.Dy + Alien.GeserY
        For i = 0 To 2
            Roda(i).Ay = Roda(i).Ay + Alien.GeserY
            Roda(i).By = Roda(i).By + Alien.GeserY
            Roda(i).Cy = Roda(i).Cy + Alien.GeserY
            Roda(i).Dy = Roda(i).Dy + Alien.GeserY
        Next
    End Sub

    Private Sub Geser_Alien_KeBawah()
        Dim i As Integer

        Alien.Ay = Alien.Ay - Alien.GeserY
        Alien.By = Alien.By - Alien.GeserY
        Alien.Cy = Alien.Cy - Alien.GeserY
        Alien.Dy = Alien.Dy - Alien.GeserY
        For i = 0 To 2
            Roda(i).Ay = Roda(i).Ay - Alien.GeserY
            Roda(i).By = Roda(i).By - Alien.GeserY
            Roda(i).Cy = Roda(i).Cy - Alien.GeserY
            Roda(i).Dy = Roda(i).Dy - Alien.GeserY
        Next
    End Sub

    Private Sub Alien_Lompat_KeAtas()

        Alien_Lompat = Alien_Lompat + 1

        If Alien_Lompat > MaxAlien_Lompat Then
            Alien_Lompat = 0
            Alien_Terjun = 0
            Alien.Status = 4
        Else
            Geser_Alien_KeAtas()
        End If
    End Sub

    Private Sub Alien_Terjun_KeBawah()

        Alien_Terjun = Alien_Terjun + 1

        If Alien_Terjun > MaxAlien_Terjun Then
            Alien_Lompat = 0
            Alien_Terjun = 0
            Alien.Status = 1
        Else
            Geser_Alien_KeBawah()
        End If
    End Sub

Deteksi tabrakan antara Alien dan Kotak Pembatas.

    Private Sub Deteksi_Tabrakan()
        Dim i, j As Integer

        Dim VektorA_KP As Vektor_Properties
        Dim VektorB_KP As Vektor_Properties
        Dim Vektor_Alien As Vektor_Properties

        Dim SkalaPro_A As Single
        Dim SkalaPro_B As Single

        Dim Peny_GeserX_Roda As Single
        Dim Peny_GeserY_Roda As Single

        Dim VektorPendekA As Vektor_Properties
        Dim VektorPendekB As Vektor_Properties

        For i = 0 To Total_KP - 1
            VektorA_KP = Create_Vektor(KotakPembatas(i).Ax, KotakPembatas(i).Ay, KotakPembatas(i).Bx, KotakPembatas(i).By)
            VektorB_KP = Create_Vektor(KotakPembatas(i).Ax, KotakPembatas(i).Ay, KotakPembatas(i).Dx, KotakPembatas(i).Dy)

            'titik kiri bawah Alien
            Vektor_Alien = Create_Vektor(KotakPembatas(i).Ax, KotakPembatas(i).Ay, Copy_Alien.Ax, Copy_Alien.Ay)

            SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorA_KP)
            SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorB_KP)

            If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                'titik kiri bawah Alien ada di dalam KP

                'titik kiri atas Alien
                Vektor_Alien = Create_Vektor(KotakPembatas(i).Ax, KotakPembatas(i).Ay, Copy_Alien.Dx, Copy_Alien.Dy)

                SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorA_KP)
                SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorB_KP)

                If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                    'titik kiri atas Alien ada di dalam KP

                    '=============================
                    'Alien Tabrak KP di sisi kanan
                    'Kondisi I
                    '=============================

                    'update posisi Alien karena tabrakan
                    'dengan KotakPembatas(KP)
                    Alien.Ax = KotakPembatas(i).Bx + 2.5
                    Alien.Bx = Alien.Ax + 200
                    Alien.Cx = Alien.Bx
                    Alien.Dx = Alien.Ax
                    'update posisi Roda karena tabrakan
                    'dengan KotakPembatas
                    Peny_GeserX_Roda = Alien.Ax - Copy_Alien.Ax
                    For j = 0 To 2
                        Roda(j).Ax = Roda(j).Ax + Peny_GeserX_Roda
                        Roda(j).Bx = Roda(j).Bx + Peny_GeserX_Roda
                        Roda(j).Cx = Roda(j).Cx + Peny_GeserX_Roda
                        Roda(j).Dx = Roda(j).Dx + Peny_GeserX_Roda
                    Next
                    Exit Sub
                End If

                'titik horisontal 2
                Vektor_Alien = Create_Vektor(KotakPembatas(i).Ax, KotakPembatas(i).Ay, Copy_Alien.Ax + 30, Copy_Alien.Ay)

                SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorA_KP)
                SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorB_KP)

                If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                    'titik horisontal 2 di dalam Kotak Pembatas

                    '=====================================
                    'Alien Tabrak KP dari sisi atas(kanan)
                    'Kondisi II
                    '=====================================

                    'update posisi Alien karena tabrakan
                    'dengan KotakPembatas
                    If (KotakPembatas(i).Cy - Alien.Ay) > Alien.GeserY Then
                        Alien.Ay = Alien.Ay + 9.5
                    Else
                        Alien.Ay = KotakPembatas(i).Cy + 2.5
                        Sound2.Play()
                    End If
                    Alien.By = Alien.Ay
                    Alien.Cy = Alien.By + 250
                    Alien.Dy = Alien.Cy
                    'update posisi Roda karena tabrakan
                    'dengan KotakPembatas
                    Peny_GeserY_Roda = Alien.Ay - Copy_Alien.Ay
                    For j = 0 To 2
                        Roda(j).Ay = Roda(j).Ay + Peny_GeserY_Roda
                        Roda(j).By = Roda(j).By + Peny_GeserY_Roda
                        Roda(j).Cy = Roda(j).Cy + Peny_GeserY_Roda
                        Roda(j).Dy = Roda(j).Dy + Peny_GeserY_Roda
                    Next

                    'terjun terlalu tinggi
                    If (Alien_Terjun > Terjun_Ketinggian) And (Alien.Status = 4) Then
                        Sound1.Play()
                        Red_Alien = True
                    End If
                    Alien_Lompat = MaxAlien_Lompat + 1
                    Alien_Terjun = MaxAlien_Terjun + 1
                    Exit Sub
                End If
            End If

            '===========
            'KONDISI III
            '===========

            'titik kiri bawah Alien
            '(perhatikan cara membuat vektor alien di bawah ini,
            'karena berbeda dengan vektor untuk kondisi I dan II)
            Vektor_Alien = Create_Vektor(KotakPembatas(i).Dx, KotakPembatas(i).Dy, Copy_Alien.Ax, Copy_Alien.Ay)

            SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorA_KP)
            SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorB_KP)

            If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                'titik kiri bawah Alien ada di atas KP

                'titik horisontal 2
                '(perhatikan cara membuat vektor alien
                'di bawah ini, karena berbeda dengan
                'vektor untuk kondisi I dan II)
                Vektor_Alien = Create_Vektor(KotakPembatas(i).Cx, KotakPembatas(i).Cy, Copy_Alien.Ax + 30, Copy_Alien.Ay)

                '=================================
                'dua buah vektor bantu
                '(panjang dua vektor harus pendek)
                '=================================
                VektorPendekA.i = 20.5
                VektorPendekA.j = 0
                VektorPendekB.i = 0
                VektorPendekB.j = 20.5

                SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorPendekA)
                SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorPendekB)

                If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                    'titik horisontal 2 ada di atas kanan KP
                    'set Alien untuk terjun ke kanan
                    Alien.Status = 4
                    Exit Sub
                End If
            End If

            'titik kanan bawah Alien
            Vektor_Alien = Create_Vektor(KotakPembatas(i).Ax, KotakPembatas(i).Ay, Copy_Alien.Bx, Copy_Alien.By)

            SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorA_KP)
            SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorB_KP)

            If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                'titik kanan bawah Alien ada di dalam KP

                'titik kanan atas Alien
                Vektor_Alien = Create_Vektor(KotakPembatas(i).Ax, KotakPembatas(i).Ay, Copy_Alien.Cx, Copy_Alien.Cy)

                SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorA_KP)
                SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorB_KP)

                If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                    'titik kanan atas Alien ada di dalam KP

                    '============================
                    'Alien Tabrak KP di sisi kiri
                    'Kondisi IV
                    '============================

                    'update posisi Alien karena tabrakan
                    'dengan KotakPembatas
                    Alien.Bx = KotakPembatas(i).Ax - 2.5
                    Alien.Ax = Alien.Bx - 200
                    Alien.Cx = Alien.Bx
                    Alien.Dx = Alien.Ax
                    'update posisi Roda karena tabrakan
                    'dengan KotakPembatas
                    Peny_GeserX_Roda = Copy_Alien.Bx - Alien.Bx
                    For j = 0 To 2
                        Roda(j).Ax = Roda(j).Ax - Peny_GeserX_Roda
                        Roda(j).Bx = Roda(j).Bx - Peny_GeserX_Roda
                        Roda(j).Cx = Roda(j).Cx - Peny_GeserX_Roda
                        Roda(j).Dx = Roda(j).Dx - Peny_GeserX_Roda
                    Next
                    Exit Sub
                End If

                'titik horisontal 3
                Vektor_Alien = Create_Vektor(KotakPembatas(i).Ax, KotakPembatas(i).Ay, Copy_Alien.Bx - 30, Copy_Alien.By)

                SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorA_KP)
                SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorB_KP)

                If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                    'titik horisontal 3 di dalam Kotak Pembatas

                    '====================================
                    'Alien Tabrak KP dari sisi atas(kiri)
                    'Kondisi V
                    '====================================

                    'update posisi Alien karena tabrakan
                    'dengan KotakPembatas
                    If (KotakPembatas(i).Cy - Alien.Ay) > Alien.GeserY Then
                        Alien.Ay = Alien.Ay + 9.5
                    Else
                        Alien.Ay = KotakPembatas(i).Cy + 2.5
                        Sound2.Play()
                    End If
                    Alien.By = Alien.Ay
                    Alien.Cy = Alien.By + 250
                    Alien.Dy = Alien.Cy
                    'update posisi Roda karena tabrakan
                    'dengan KotakPembatas
                    Peny_GeserY_Roda = Alien.Ay - Copy_Alien.Ay
                    For j = 0 To 2
                        Roda(j).Ay = Roda(j).Ay + Peny_GeserY_Roda
                        Roda(j).By = Roda(j).By + Peny_GeserY_Roda
                        Roda(j).Cy = Roda(j).Cy + Peny_GeserY_Roda
                        Roda(j).Dy = Roda(j).Dy + Peny_GeserY_Roda
                    Next

                    'terjun terlalu tinggi
                    If (Alien_Terjun > Terjun_Ketinggian) And (Alien.Status = 4) Then
                        Sound1.Play()
                        Red_Alien = True
                    End If
                    Alien_Lompat = MaxAlien_Lompat + 1
                    Alien_Terjun = MaxAlien_Terjun + 1
                    Exit Sub
                End If
            End If

            '==========
            'KONDISI VI
            '==========

            'titik kanan bawah Alien
            '(perhatikan cara membuat vektor alien di bawah ini,
            'karena berbeda dengan vektor untuk kondisi IV dan V)
            Vektor_Alien = Create_Vektor(KotakPembatas(i).Dx, KotakPembatas(i).Dy, Copy_Alien.Bx, Copy_Alien.By)

            SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorA_KP)
            SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorB_KP)

            If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                'titik kanan bawah Alien ada di atas KP

                'titik horisontal 3
                '(perhatikan cara membuat vektor alien
                'di bawah ini, karena berbeda dengan
                'vektor untuk kondisi IV dan V)
                Vektor_Alien = Create_Vektor(KotakPembatas(i).Dx, KotakPembatas(i).Dy, Copy_Alien.Bx - 30, Copy_Alien.By)

                '=================================
                'dua buah vektor bantu
                '(panjang dua vektor harus pendek)
                '=================================
                VektorPendekA.i = -20.5
                VektorPendekA.j = 0
                VektorPendekB.i = 0
                VektorPendekB.j = 20.5

                SkalaPro_A = SkalaProyeksi_Vektor(Vektor_Alien, VektorPendekA)
                SkalaPro_B = SkalaProyeksi_Vektor(Vektor_Alien, VektorPendekB)

                If Inside_KotakPembatas(SkalaPro_A, SkalaPro_B) Then
                    'titik horisontal 3 ada di atas kiri KP
                    'set Alien untuk terjun ke kiri
                    Alien.Status = 4
                End If
            End If

        Next
    End Sub

Tuntas sudah pembicaraan tentang side scrolling game beserta programnya, teori yang ogut tulis di artikel ini bisa terus dikembangkan lagi, ini hanya contoh sederhana saja dan teori ini juga telah digunakan untuk game Darfo, selamat belajar rekan-rekan.

Update 2 Jan 2016

Ini juga game Jack Onil yang ogut buat, artikel ada 19 bab semuanya sudah ogut posting.



Salam Game Selalu


Heriady
heriady.yoh@gmail.com




Artikel terkait

Mendeteksi Posisi dengan Vektor Proyeksi

Deteksi Tabrakan dengan Proyeksi Vektor

Deteksi Tabrakan dengan Panjang Vektor / Radius

Vektor R2

Membatasi Ruang Gerak PacMan

Pagi hari yang cerah, burung-burung  pada lompat sana dan lompat sini menyambut pagi...


Selamat pagi rekan-rekan sekalian, senang rasanya bisa kembali menulis di blog ini, blog yang aku peruntukkan untuk membagi ilmu pemrograman grafik game.

Pada kesempatan kali ini ogut masih akan bercerita tentang vektor yang bermanfaat untuk membatasi ruang gerak suatu objek. Program yang menggunakan perhitungan skala proyeksi vektor untuk membatasi ruang gerak sebuah objek.


Contoh implementasi membatasi ruang gerak sebuah objek dapat Anda lihat pada program PacMan, tokoh pacman hanya dapat berjalan di jalur-jalur yang telah ditentukan karena ruang geraknya dibatasi.


Untuk proses pendeteksian agar pacman tidak menabrak tembok diperlukan tiga buah titik deteksi seperti yang terlihat pada gambar di atas.

Berikut kode program untuk program PacMan, perhatikanlah cara untuk menentukan tiga titik deteksi, source code dapat Anda download di link yang telah disediakan.

Tentukan nilai awal untuk PacMan dan Tembok.

    Public Sub SettingNilaiAwal()
        'PacMan
        PacMan.Ax = -45 : PacMan.Ay = -45
        PacMan.Bx = 45 : PacMan.By = -45
        PacMan.Cx = 45 : PacMan.Cy = 45
        PacMan.Dx = -45 : PacMan.Dy = 45

        PacMan.Index_Tekstur = 0
        Delay_Tekstur_Pacman = 1
        Plus_Indeks_Tekstur_Pacman = True
        'set tekstur PacMan arah kiri
        TkAx = 0 : TkAy = 0
        TkBx = 1 : TkBy = 0
        TkCx = 1 : TkCy = 1
        TkDx = 0 : TkDy = 1

        PacMan_Speed = 8

        'Tembok(0) horisontal atas
        Tembok(0).Ax = -GlControl1.Width + 10
        Tembok(0).Ay = GlControl1.Height - 70
        Tembok(0).Bx = GlControl1.Width - 10
        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

        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

        'Tembok(1) vertikal kiri
        Tembok(1).Ax = -GlControl1.Width + 370
        Tembok(1).Ay = -GlControl1.Height + 200
        Tembok(1).Bx = Tembok(1).Ax
        Tembok(1).By = Tembok(1).Ay + 600
        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

        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

        'Tembok(2) vertikal kanan
        Tembok(2).Ax = -GlControl1.Width + 570
        Tembok(2).Ay = -GlControl1.Height + 400
        Tembok(2).Bx = Tembok(2).Ax
        Tembok(2).By = Tembok(2).Ay + 400
        Tembok(2).Cx = Tembok(2).Bx - 50
        Tembok(2).Cy = Tembok(2).By
        Tembok(2).Dx = Tembok(2).Cx
        Tembok(2).Dy = Tembok(2).Ay

        Tembok(2).VektorA.i = Tembok(2).Bx - Tembok(2).Ax
        Tembok(2).VektorA.j = Tembok(2).By - Tembok(2).Ay
        Tembok(2).VektorB.i = Tembok(2).Dx - Tembok(2).Ax
        Tembok(2).VektorB.j = Tembok(2).Dy - Tembok(2).Ay

        'Tembok(3) horisontal tengah
        Tembok(3).Ax = -GlControl1.Width + 520
        Tembok(3).Ay = -GlControl1.Height + 350
        Tembok(3).Bx = GlControl1.Width - 10
        Tembok(3).By = Tembok(3).Ay
        Tembok(3).Cx = Tembok(3).Bx
        Tembok(3).Cy = Tembok(3).By + 50
        Tembok(3).Dx = Tembok(3).Ax
        Tembok(3).Dy = Tembok(3).Cy

        Tembok(3).VektorA.i = Tembok(3).Bx - Tembok(3).Ax
        Tembok(3).VektorA.j = Tembok(3).By - Tembok(3).Ay
        Tembok(3).VektorB.i = Tembok(3).Dx - Tembok(3).Ax
        Tembok(3).VektorB.j = Tembok(3).Dy - Tembok(3).Ay

        'Tembok(4) horisontal terbawah
        Tembok(4).Ax = -GlControl1.Width + 10
        Tembok(4).Ay = -GlControl1.Height + 150
        Tembok(4).Bx = Tembok(4).Ax + 900
        Tembok(4).By = Tembok(4).Ay
        Tembok(4).Cx = Tembok(4).Bx
        Tembok(4).Cy = Tembok(4).By + 50
        Tembok(4).Dx = Tembok(4).Ax
        Tembok(4).Dy = Tembok(4).Cy

        Tembok(4).VektorA.i = Tembok(4).Bx - Tembok(4).Ax
        Tembok(4).VektorA.j = Tembok(4).By - Tembok(4).Ay
        Tembok(4).VektorB.i = Tembok(4).Dx - Tembok(4).Ax
        Tembok(4).VektorB.j = Tembok(4).Dy - Tembok(4).Ay

    End Sub

Gerakkan PacMan sesuai dengan tombol keyboard yang ditekan user, serta hitung tiga titik deteksi tabrakan.

    Private Sub Tekan_Keyboard()
        NilaiKey = 0
        'kiri
        If (GetKeyState(Keys.J) And &H1000) Then
            NilaiKey = NilaiKey + 10000
        End If
        'kanan
        If (GetKeyState(Keys.L) And &H1000) Then
            NilaiKey = NilaiKey + 20000
        End If
        'atas
        If (GetKeyState(Keys.I) And &H1000) Then
            NilaiKey = NilaiKey + 1000
        End If
        'bawah
        If (GetKeyState(Keys.K) And &H1000) Then
            NilaiKey = NilaiKey + 2000
        End If

        '==========================================
        'proses sesuai dengan key yang ditekan user
        '==========================================

        'kiri
        If NilaiKey = 10000 Then
            TkAx = 0 : TkAy = 0
            TkBx = 1 : TkBy = 0
            TkCx = 1 : TkCy = 1
            TkDx = 0 : TkDy = 1

            '=====================================
            'tentukan titik untuk deteksi tabrakan
            '=====================================
            'titik pertama
            DeteksiTitikX1 = PacMan.Ax - PacMan_Speed
            DeteksiTitikY1 = PacMan.Ay
            'titik kedua
            DeteksiTitikX2 = PacMan.Dx - PacMan_Speed
            DeteksiTitikY2 = PacMan.Dy
            'titik tengah
            DeteksiTitikTengahX = DeteksiTitikX1
            DeteksiTitikTengahY = DeteksiTitikY1 + ((DeteksiTitikY2 - DeteksiTitikY1) / 2)
        End If

        'kanan
        If NilaiKey = 20000 Then
            TkAx = 1 : TkAy = 0
            TkBx = 0 : TkBy = 0
            TkCx = 0 : TkCy = 1
            TkDx = 1 : TkDy = 1

            '=====================================
            'tentukan titik untuk deteksi tabrakan
            '=====================================
            'titik pertama
            DeteksiTitikX1 = PacMan.Bx + PacMan_Speed
            DeteksiTitikY1 = PacMan.By
            'titik kedua
            DeteksiTitikX2 = PacMan.Cx + PacMan_Speed
            DeteksiTitikY2 = PacMan.Cy
            'titik tengah
            DeteksiTitikTengahX = DeteksiTitikX1
            DeteksiTitikTengahY = DeteksiTitikY1 + ((DeteksiTitikY2 - DeteksiTitikY1) / 2)
        End If

        'atas
        If NilaiKey = 1000 Then
            TkAx = 1 : TkAy = 0
            TkBx = 1 : TkBy = 1
            TkCx = 0 : TkCy = 1
            TkDx = 0 : TkDy = 0

            '=====================================
            'tentukan titik untuk deteksi tabrakan
            '=====================================
            'titik pertama
            DeteksiTitikX1 = PacMan.Cx
            DeteksiTitikY1 = PacMan.Cy + PacMan_Speed
            'titik kedua
            DeteksiTitikX2 = PacMan.Dx
            DeteksiTitikY2 = PacMan.Dy + PacMan_Speed
            'titik tengah
            DeteksiTitikTengahX = DeteksiTitikX2 + ((DeteksiTitikX1 - DeteksiTitikX2) / 2)
            DeteksiTitikTengahY = DeteksiTitikY1
        End If

        'bawah
        If NilaiKey = 2000 Then
            TkAx = 0 : TkAy = 1
            TkBx = 0 : TkBy = 0
            TkCx = 1 : TkCy = 0
            TkDx = 1 : TkDy = 1

            '=====================================
            'tentukan titik untuk deteksi tabrakan
            '=====================================
            'titik pertama
            DeteksiTitikX1 = PacMan.Ax
            DeteksiTitikY1 = PacMan.Ay - PacMan_Speed
            'titik kedua
            DeteksiTitikX2 = PacMan.Bx
            DeteksiTitikY2 = PacMan.By - PacMan_Speed
            'titik tengah
            DeteksiTitikTengahX = DeteksiTitikX1 + ((DeteksiTitikX2 - DeteksiTitikX1) / 2)
            DeteksiTitikTengahY = DeteksiTitikY1
        End If
    End Sub

Deteksi tabrakan antara PacMan dan Tembok.

    Private Sub Render_PacMan()
        'membuat animasi mulut PacMan bergerak
        Delay_Tekstur_Pacman = Delay_Tekstur_Pacman + 1
        If Delay_Tekstur_Pacman > 2 Then
            Delay_Tekstur_Pacman = 1

            If Plus_Indeks_Tekstur_Pacman = True Then
                PacMan.Index_Tekstur = PacMan.Index_Tekstur + 1
                If PacMan.Index_Tekstur > 3 Then
                    PacMan.Index_Tekstur = 2
                    Plus_Indeks_Tekstur_Pacman = False
                End If
            Else
                'minus
                PacMan.Index_Tekstur = PacMan.Index_Tekstur - 1
                If PacMan.Index_Tekstur = -1 Then
                    PacMan.Index_Tekstur = 1
                    Plus_Indeks_Tekstur_Pacman = True
                End If
            End If
        End If

        '===================================
        'deteksi tabrakan dengan tembok
        '(3 titik untuk mendeteksi tabrakan)
        '===================================
        Dim i As Integer
        Dim SkalaPro1, SkalaPro2 As Single
        Dim Vektor_PacMan As Vektor_Properties
        Dim OK_Translasi_PacMan As Boolean

        OK_Translasi_PacMan = True

        For i = 0 To 4
            'deteksi tabrakan titik pertama
            Vektor_PacMan = Create_Vektor(Tembok(i).Ax, Tembok(i).Ay, DeteksiTitikX1, DeteksiTitikY1)
            'hitung skala proyeksi
            SkalaPro1 = Dot_Product(Vektor_PacMan, Tembok(i).VektorA) / (Panjang_Vektor(Tembok(i).VektorA) * Panjang_Vektor(Tembok(i).VektorA))
            SkalaPro2 = Dot_Product(Vektor_PacMan, Tembok(i).VektorB) / (Panjang_Vektor(Tembok(i).VektorB) * Panjang_Vektor(Tembok(i).VektorB))

            If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
                'PacMan menabrak tembok
                OK_Translasi_PacMan = False
            Else
                'deteksi tabrakan titik kedua
                Vektor_PacMan = Create_Vektor(Tembok(i).Ax, Tembok(i).Ay, DeteksiTitikX2, DeteksiTitikY2)
                'hitung skala proyeksi
                SkalaPro1 = Dot_Product(Vektor_PacMan, Tembok(i).VektorA) / (Panjang_Vektor(Tembok(i).VektorA) * Panjang_Vektor(Tembok(i).VektorA))
                SkalaPro2 = Dot_Product(Vektor_PacMan, Tembok(i).VektorB) / (Panjang_Vektor(Tembok(i).VektorB) * Panjang_Vektor(Tembok(i).VektorB))

                If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
                    'PacMan menabrak tembok
                    OK_Translasi_PacMan = False
                Else
                    'deteksi tabrakan titik tengah
                    Vektor_PacMan = Create_Vektor(Tembok(i).Ax, Tembok(i).Ay, DeteksiTitikTengahX, DeteksiTitikTengahY)
                    'hitung skala proyeksi
                    SkalaPro1 = Dot_Product(Vektor_PacMan, Tembok(i).VektorA) / (Panjang_Vektor(Tembok(i).VektorA) * Panjang_Vektor(Tembok(i).VektorA))
                    SkalaPro2 = Dot_Product(Vektor_PacMan, Tembok(i).VektorB) / (Panjang_Vektor(Tembok(i).VektorB) * Panjang_Vektor(Tembok(i).VektorB))

                    If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
                        'PacMan menabrak tembok
                        OK_Translasi_PacMan = False
                    End If
                End If
            End If
        Next

        '==============================================
        'translasi PacMan karena tidak terjadi tabrakan
        '==============================================
        If OK_Translasi_PacMan = True Then
            Translasi_PacMan()
        End If

        GL.Enable(EnableCap.Blend)
        GL.BlendFunc(BlendingFactorSrc.DstColor, BlendingFactorDest.Zero)

        'Mask
        GL.BindTexture(TextureTarget.Texture2D, PacManBMP_Mask(PacMan.Index_Tekstur))
        GL.Begin(BeginMode.Quads)
        GL.TexCoord2(TkAx, TkAy) : GL.Vertex2(PacMan.Ax, PacMan.Ay)
        GL.TexCoord2(TkBx, TkBy) : GL.Vertex2(PacMan.Bx, PacMan.By)
        GL.TexCoord2(TkCx, TkCy) : GL.Vertex2(PacMan.Cx, PacMan.Cy)
        GL.TexCoord2(TkDx, TkDy) : GL.Vertex2(PacMan.Dx, PacMan.Dy)
        GL.End()

        GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One)
        'BMP
        GL.BindTexture(TextureTarget.Texture2D, PacManBMP(PacMan.Index_Tekstur))
        GL.Begin(BeginMode.Quads)
        GL.TexCoord2(TkAx, TkAy) : GL.Vertex2(PacMan.Ax, PacMan.Ay)
        GL.TexCoord2(TkBx, TkBy) : GL.Vertex2(PacMan.Bx, PacMan.By)
        GL.TexCoord2(TkCx, TkCy) : GL.Vertex2(PacMan.Cx, PacMan.Cy)
        GL.TexCoord2(TkDx, TkDy) : GL.Vertex2(PacMan.Dx, PacMan.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(PacMan.Ax, PacMan.Ay)
            GL.Vertex2(PacMan.Bx, PacMan.By)
            GL.Vertex2(PacMan.Cx, PacMan.Cy)
            GL.Vertex2(PacMan.Dx, PacMan.Dy)
            GL.End()
        End If
    End Sub

    Private Sub Translasi_PacMan()
        '=====================================
        'proses translasi tidak memakai vektor
        '=====================================
        'kiri
        If NilaiKey = 10000 Then
            PacMan.Ax = PacMan.Ax - PacMan_Speed
            PacMan.Bx = PacMan.Bx - PacMan_Speed
            PacMan.Cx = PacMan.Cx - PacMan_Speed
            PacMan.Dx = PacMan.Dx - PacMan_Speed
        End If
        'kanan
        If NilaiKey = 20000 Then
            PacMan.Ax = PacMan.Ax + PacMan_Speed
            PacMan.Bx = PacMan.Bx + PacMan_Speed
            PacMan.Cx = PacMan.Cx + PacMan_Speed
            PacMan.Dx = PacMan.Dx + PacMan_Speed
        End If
        'atas
        If NilaiKey = 1000 Then
            PacMan.Ay = PacMan.Ay + PacMan_Speed
            PacMan.By = PacMan.By + PacMan_Speed
            PacMan.Cy = PacMan.Cy + PacMan_Speed
            PacMan.Dy = PacMan.Dy + PacMan_Speed
        End If
        'bawah
        If NilaiKey = 2000 Then
            PacMan.Ay = PacMan.Ay - PacMan_Speed
            PacMan.By = PacMan.By - PacMan_Speed
            PacMan.Cy = PacMan.Cy - PacMan_Speed
            PacMan.Dy = PacMan.Dy - PacMan_Speed
        End If
    End Sub

Ok rekan-rekan sekalian sampai disini dulu artikel kali ini pada kesempatan lain kita sambung lagi obrolan tentang vektor, matematika, game dan grafik programming.

Update 2 Jan 2016

Game lain yang pernah ogut buat dengan VB 6



Salam Sukses Selalu


Heriady
heriady.yoh@gmail.com




Artikel terkait

Mendeteksi Posisi dengan Vektor Proyeksi

Deteksi Tabrakan dengan Proyeksi Vektor

Deteksi Tabrakan dengan Panjang Vektor / Radius

Vektor R2

Minggu, 19 Juli 2015

Akrobatik Rotasi 360 Derajat

Hari minggu yang cerah semangat baru telah muncul kembali...


Selamat pagi rekan-rekan sekalian, di pagi hari ini ogut akan meneruskan cerita tentang Moto Alien yang akan berakrobat mengikuti lingkaran seperti Anda lihat pada gambar di bawah ini.


Untuk membuat gerakan melingkar digunakan rumus rotasi, kotak pembatas (KP / warna merah kecil di bagian bawah lingkaran) digunakan untuk mendeteksi posisi dari Moto Alien, pada saat Moto Alien menabrak KP maka rotasi Moto Alien, tetapi jika tidak di dalam KP Moto Alien akan bergerak kekiri atau kekanan.


Ogut tidak akan membahas tentang rotasi karena Anda dapat membaca di artikel sebelumnya, sampai disini dulu rekan-rekan, semoga artikel ini bermanfaat.

Salam matematika always


Heriady
heriady.yoh@gmail.com




Artikel terkait

Matematika rotasi untuk animasi OpenTK 2D

Vektor untuk Tanjakan dan Turunan

Suatu pagi yang cerah munculah ide ini...

Update 1 Jan 2016




Selamat pagi rekan-rekan sekalian, di pagi hari ini ogut akan membagikan ide yang sangat berguna untuk pemrograman game, dan tentu saja membahas tentang vektor yang membantu ogut untuk menyelesaikan permasalahannya.

Program kali ini bercerita tentang Moto Alien akan berjalan mengikuti tanjakan dan turunan seperti Anda lihat pada gambar di bawah ini. Hanya dengan menggunakan perhitungan matematika proyeksi vektor yang sederhana Anda dapat membuat program seperti ini.


Karena vektor yang digunakan banyak maka ogut membagi wilayah pembatas (Kotak Pembatas / KP) seperti yang terlihat pada gambar di bawah ini, setiap KP (berwarna merah) mempunyai satu vektor sebagai jalan Moto Alien. Jadi Moto Alien akan mengikuti arah vektor sesuai dengan posisinya.


Ogut tidak akan menjelaskan kembali apa itu proyeksi vektor dan sebagainya karena sudah pernah dijelaskan di artikel sebelumnya.

Ok rekan-rekan, semoga ide ini bermanfaat bagi Anda semua dan sampai ketemu lagi di artikel berikutnya.

Update 1 Jan 2016

Klik link berikut ini untuk menuju artikel yang berhubungan dengan vektor, Sudut Vektor dan Vektor Pantul.





Salam matematika vektor


Heriady
heriady.yoh@gmail.com




Artikel terkait

Matematika Vektor R2

Vektor Pantul

Manfaat Sudut Vektor

String Movement (Animasi dengan Vektor Translasi 2)