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