Minggu, 08 November 2015

Jack Onil Bab-16 Bergerak Vertikal

Langkah berikutnya yang ogut lakukan untuk membuat game versi kedua adalah membuat Onil agar bisa bergerak secara vertikal(atas dan bawah).


Dengan membuat pergerakan vertikal pada tokoh Onil dapat membuat game ini menjadi lebih bervariasi dan lebih mudah untuk dikembangkan.


16.1 Elemen Matriks
Pada versi sebelumnya Onil bergerak berdasarkan matriks berordo 70x29, demikian juga pada versi kedua, ogut tetap menggunakan matriks yang sama, tetapi isi dari matriks ogut ubah.

Matriks ogut ubah isinya agar Onil bisa bergerak vertikal, pada matriks terdahulu hanya pada baris terakhir elemen matriks bernilai 1, sedangkan elemen yang lain bernilai 0(nol).

Untuk versi kedua ogut mengubah elemen matriks pada kolom pertama dan kolom terakhir, beberapa elemen dari matriks di kolom-kolom tersebut ogut ubah dari bernilai 0(nol) menjadi 1. Agar lebih jelas Anda dapat melihat isi matriks pada file Matriks_Onil.txt di folder Bab16_NaikTangga.

16.2 Tekstur Naik Tangga
Dengan bertambahnya kemampuan Onil untuk dapat bergerak vertikal, maka perlu dilakukan perubahan terhadap tekstur Onil.

Ogut memakai array dua dimensi untuk menyimpan tekstur Onil.


'Texture
Public Text_Onil_I(1, 8) As GLuint
Public Text_Onil_M(1, 8) As GLuint

Indeks pertama digunakan untuk menentukan tekstur yang akan dipakai Onil untuk berlari atau naik tangga.

Public Function Load_All_texture() As Boolean

    ...
    ...  
    ...
   
    'Tekstur Jack Onil lari(Image)
    If Not Create_Texture(Text_Onil_I(0, 0), _
            "\Texture\Jack_Onil\Onil_0i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(0, 1), _
            "\Texture\Jack_Onil\Onil_1i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(0, 2), _
            "\Texture\Jack_Onil\Onil_2i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(0, 3), _
            "\Texture\Jack_Onil\Onil_3i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(0, 4), _
            "\Texture\Jack_Onil\Onil_4i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(0, 5), _
            "\Texture\Jack_Onil\Onil_5i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(0, 6), _
            "\Texture\Jack_Onil\Onil_6i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(0, 7), _
            "\Texture\Jack_Onil\Onil_7i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(0, 8), _
            "\Texture\Jack_Onil\Onil_8i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    'Tekstur Jack Onil lari (Mask)
    If Not Create_Texture(Text_Onil_M(0, 0), _
            "\Texture\Jack_Onil\Onil_0m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(0, 1), _
            "\Texture\Jack_Onil\Onil_1m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(0, 2), _
            "\Texture\Jack_Onil\Onil_2m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(0, 3), _
            "\Texture\Jack_Onil\Onil_3m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(0, 4), _
            "\Texture\Jack_Onil\Onil_4m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(0, 5), _
            "\Texture\Jack_Onil\Onil_5m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(0, 6), _
            "\Texture\Jack_Onil\Onil_6m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(0, 7), _
            "\Texture\Jack_Onil\Onil_7m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(0, 8), _
            "\Texture\Jack_Onil\Onil_8m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    'Tekstur Jack Onil Naik tangga(Image)
    If Not Create_Texture(Text_Onil_I(1, 0), _
            "\Texture\Jack_Onil\OnilNT_0i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1, 1), _
            "\Texture\Jack_Onil\OnilNT_1i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1, 2), _
            "\Texture\Jack_Onil\OnilNT_2i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1, 3), _
            "\Texture\Jack_Onil\OnilNT_3i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1, 4), _
            "\Texture\Jack_Onil\OnilNT_4i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1, 5), _
            "\Texture\Jack_Onil\OnilNT_5i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1, 6), _
            "\Texture\Jack_Onil\OnilNT_6i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1, 7), _
            "\Texture\Jack_Onil\OnilNT_7i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1, 8), _
            "\Texture\Jack_Onil\OnilNT_8i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    'Tekstur Jack Onil Naik tangga (Mask)
    If Not Create_Texture(Text_Onil_M(1, 0), _
            "\Texture\Jack_Onil\OnilNT_0m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1, 1), _
            "\Texture\Jack_Onil\OnilNT_1m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1, 2), _
            "\Texture\Jack_Onil\OnilNT_2m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1, 3), _
            "\Texture\Jack_Onil\OnilNT_3m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1, 4), _
            "\Texture\Jack_Onil\OnilNT_4m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1, 5), _
            "\Texture\Jack_Onil\OnilNT_5m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1, 6), _
            "\Texture\Jack_Onil\OnilNT_6m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1, 7), _
            "\Texture\Jack_Onil\OnilNT_7m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1, 8), _
            "\Texture\Jack_Onil\OnilNT_8m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    ...
    ...
    ...
                 
    'jika semua berjalan baik return true
    Load_All_texture = True
End Function

16.3 Tombol dan Timer
Untuk memudahkan pemain game menjalankan Onil ogut menambah fungsi tombol sebanyak dua buah, yaitu tombol atas(up) dan tombol bawah(down).

Timer juga dibutuhkan untuk mengatur kecepatan Onil naik turun, karena nilai dGeserX dan dGeserY pada Onil berbeda, sehingga lebih baik timer Onil untuk bergerak kiri dan kanan dipisahkan dengan timer untuk bergerak atas bawah.

Public Sub Load_GO_Timer()
    'timer aktifkan IL
    MaxT_Isi_IL = 8000 'waktu terlama 8000
    MinT_Isi_IL = 1000 'waktu tersingkat
   
    BedaT_Isi_IL = (MaxT_Isi_IL - MinT_Isi_IL) _
                        / MaxT_Level
   
    Timer_Isi_IL.TDelay = MaxT_Isi_IL
    Timer_Isi_IL.TGetFirst = True
   
    'timer IL jatuh
    MaxT_IL_Jatuh = 200
    MinT_IL_Jatuh = 10
   
    Timer_IL_Jatuh = MaxT_IL_Jatuh
    BedaT_IL_Jatuh = (MaxT_IL_Jatuh - MinT_IL_Jatuh) _
                        / MaxT_Level
   
    'Timer Onil LR
    MaxT_OnilLR = 50
    MinT_OnilLR = 10

    Timer_OnilLR = MaxT_OnilLR
    BedaT_OnilLR = (MaxT_OnilLR - MinT_OnilLR) _
                        / MaxT_Level
                       
    'Timer Onil UD
    MaxT_OnilUD = 20
    MinT_OnilUD = 4

    Timer_OnilUD = MaxT_OnilUD
    BedaT_OnilUD = (MaxT_OnilUD - MinT_OnilUD) _
                        / MaxT_Level

    'Timer laju pesawat IL
    MaxT_PlaneIL = 50
    MinT_PlaneIL = 10
   
    Timer_PlaneIL = MaxT_PlaneIL
    BedaT_PlaneIL = (MaxT_PlaneIL - MinT_PlaneIL) _
                        / MaxT_Level
   
End Sub

Public Sub Level_Meningkat()

    If MinT_Level < MaxT_Level Then
        MinT_Level = MinT_Level + 1
       
        'update timer IL muncul ke layar(isi IL)
        Timer_Isi_IL.TDelay = Timer_Isi_IL.TDelay - _
                                BedaT_Isi_IL
       
        'update timer kecepatan jatuh IL
        '(Timer_IL_jatuh dipakai pada sub
        'Aktifkan_IL)
        Timer_IL_Jatuh = Timer_IL_Jatuh - _
                                BedaT_IL_Jatuh
   
        'update timer Onil bergerak
        Timer_OnilLR = Timer_OnilLR - BedaT_OnilLR
        Onil_TimerLR.TDelay = Timer_OnilLR
       
        Timer_OnilUD = Timer_OnilUD - BedaT_OnilUD
        Onil_TimerUD.TDelay = Timer_OnilUD
       
        'update timer laju pesawat IL
        Timer_PlaneIL = Timer_PlaneIL - BedaT_PlaneIL
    End If
End Sub

Dengan menggunakan timer yang berbeda untuk kiri kanan serta atas bawah maka sub Keyboard_Ditekan juga turut berubah menjadi seperti di bawah.

Private Sub Keyboard_Ditekan()
   
    'keluar dari program bila Escape ditekan
    If (GetKeyState(vbKeyEscape) And &H1000) Then
        Selesai = True
    End If
   
   
    'jika tombol Shift ditekan maka kecepatan
    'Onil akan berkurang
    Delay_Key_Onil = 0
    If GetKeyState(vbKeyShift) And &H1000 Then
        Delay_Key_Onil = 10
    End If
   
    'kiri
    If GetKeyState(vbKeyLeft) And &H1000 Then
       
        If Counter_Key_Onil = Delay_Key_Onil Then
            Geser_Kiri_Onil
        End If
       
        Counter_Key_Onil = Counter_Key_Onil + 1
        If Counter_Key_Onil > Delay_Key_Onil Then
            Counter_Key_Onil = 0
        End If
       
    End If
   
    'kanan
    If GetKeyState(vbKeyRight) And &H1000 Then
        If Counter_Key_Onil = Delay_Key_Onil Then
            Geser_Kanan_Onil
        End If
       
        Counter_Key_Onil = Counter_Key_Onil + 1
        If Counter_Key_Onil > Delay_Key_Onil Then
            Counter_Key_Onil = 0
        End If
    End If
   
    'atas
    If GetKeyState(vbKeyUp) And &H1000 Then
        If Counter_Key_Onil = Delay_Key_Onil Then
            Geser_Atas_Onil
        End If
       
        Counter_Key_Onil = Counter_Key_Onil + 1
        If Counter_Key_Onil > Delay_Key_Onil Then
            Counter_Key_Onil = 0
        End If
    End If
   
    'bawah
    If GetKeyState(vbKeyDown) And &H1000 Then
        If Counter_Key_Onil = Delay_Key_Onil Then
            Geser_Bawah_Onil
        End If
       
        Counter_Key_Onil = Counter_Key_Onil + 1
        If Counter_Key_Onil > Delay_Key_Onil Then
            Counter_Key_Onil = 0
        End If
    End If
   
End Sub

16.4 Onil Bergerak
Untuk membuat Onil bergerak diperlukan dua sub tambahan agar Onil bergerak ke atas dan ke bawah, sedangkan sub yang dipakai untuk menggerakkan Onil ke kiri dan ke kanan terdapat penambahan sebuah variabel yang dipakai untuk indeks tekstur.

Public Sub Load_Onil()
    'Timer Onil Bergerak
   
    'perkecil nilai TDelay agar
    'gerakan Onil lebih cepat
    Onil_TimerLR.TDelay = Timer_OnilLR
    Onil_TimerLR.TFirst = True
   
    Onil_TimerUD.TDelay = Timer_OnilUD
    Onil_TimerUD.TFirst = True
   
    Jack_Onil.Score = 0
    Jack_Onil.Life = 3
End Sub

Public Sub Geser_Kanan_Onil()

    'Onil bisa bergerak jika sesuai dengan Timer
    'dan tidak berada di luar matriks
    If My_Timer(Onil_TimerLR) And _
        TempIK_M < (Kolom_M - 1) Then
       
        'geser ke kanan berarti kolom bertambah 1
        TempIK_M = TempIK_M + 1
       
        'jika elemen matriks = 1 maka Onil
        'bisa bergerak ke tempat tujuan
        If Matriks_Onil(TempIB_M, _
                            TempIK_M) = 1 Then
            Jack_Onil.X1 = Jack_Onil.X1 + _
                            Jack_Onil.dGeserX
            Jack_Onil.X2 = Jack_Onil.X2 + _
                            Jack_Onil.dGeserX
            Jack_Onil.X3 = Jack_Onil.X3 + _
                            Jack_Onil.dGeserX
            Jack_Onil.X4 = Jack_Onil.X4 + _
                            Jack_Onil.dGeserX
       
            'isi dengan kolom matriks yang baru
            Jack_Onil.IK_M = TempIK_M
           
            'supaya tekstur Onil berganti-ganti
            Jack_Onil.Index_Texture = _
                        Jack_Onil.Index_Texture + 1
                       
            If Jack_Onil.Index_Texture > 8 Then
                Jack_Onil.Index_Texture = 0
            End If
           
            'pilih tekstur berlari
            Lari_NaikTangga = 0
           
        Else
            TempIK_M = Jack_Onil.IK_M
        End If
       
    End If
End Sub

Public Sub Geser_Kiri_Onil()
   
    If My_Timer(Onil_TimerLR) And _
                            TempIK_M > 0 Then
                           
        'geser ke kiri berarti kolom berkurang 1
        TempIK_M = TempIK_M - 1
       
        If Matriks_Onil(TempIB_M, _
                            TempIK_M) = 1 Then
            Jack_Onil.X1 = Jack_Onil.X1 - _
                            Jack_Onil.dGeserX
            Jack_Onil.X2 = Jack_Onil.X2 - _
                            Jack_Onil.dGeserX
            Jack_Onil.X3 = Jack_Onil.X3 - _
                            Jack_Onil.dGeserX
            Jack_Onil.X4 = Jack_Onil.X4 - _
                            Jack_Onil.dGeserX
       
            Jack_Onil.IK_M = TempIK_M
       
            'supaya tekstur Onil berganti-ganti
            Jack_Onil.Index_Texture = _
                        Jack_Onil.Index_Texture - 1
                       
            If Jack_Onil.Index_Texture < 0 Then
                Jack_Onil.Index_Texture = 8
            End If
           
            'pilih tekstur berlari
            Lari_NaikTangga = 0
           
        Else
            TempIK_M = Jack_Onil.IK_M
        End If
       
    End If
End Sub

Public Sub Geser_Atas_Onil()
   
    If My_Timer(Onil_TimerUD) And _
        TempIB_M > 0 Then
       
        'Onil bergerak ke atas berarti
        'baris berkurang 1
        TempIB_M = TempIB_M - 1
       
        If Matriks_Onil(TempIB_M, _
                            TempIK_M) = 1 Then
            'Update koordinat Y
            Jack_Onil.Y1 = Jack_Onil.Y1 + _
                            Jack_Onil.dGeserY
            Jack_Onil.Y2 = Jack_Onil.Y2 + _
                            Jack_Onil.dGeserY
            Jack_Onil.Y3 = Jack_Onil.Y3 + _
                            Jack_Onil.dGeserY
            Jack_Onil.Y4 = Jack_Onil.Y4 + _
                            Jack_Onil.dGeserY
       
            Jack_Onil.IB_M = TempIB_M
           
            'supaya tekstur Onil berganti-ganti
            Jack_Onil.Index_Texture = _
                        Jack_Onil.Index_Texture - 1
                       
            If Jack_Onil.Index_Texture < 0 Then
                Jack_Onil.Index_Texture = 8
            End If
           
            'pilih tekstur naik tangga
            Lari_NaikTangga = 1
           
        Else
            TempIB_M = Jack_Onil.IB_M
        End If
   
    End If
End Sub

Public Sub Geser_Bawah_Onil()

    If My_Timer(Onil_TimerUD) And _
            TempIB_M < (Baris_M - 1) Then
       
        'bergeser ke bawah jadi baris tambah 1
        TempIB_M = TempIB_M + 1
       
        If Matriks_Onil(TempIB_M, _
                            TempIK_M) = 1 Then
                           
            'update koordinat Y
            Jack_Onil.Y1 = Jack_Onil.Y1 - _
                                Jack_Onil.dGeserY
            Jack_Onil.Y2 = Jack_Onil.Y2 - _
                                Jack_Onil.dGeserY
            Jack_Onil.Y3 = Jack_Onil.Y3 - _
                                Jack_Onil.dGeserY
            Jack_Onil.Y4 = Jack_Onil.Y4 - _
                                Jack_Onil.dGeserY
       
            Jack_Onil.IB_M = TempIB_M
           
            'supaya tekstur Onil berganti-ganti
            Jack_Onil.Index_Texture = _
                        Jack_Onil.Index_Texture + 1
           
            If Jack_Onil.Index_Texture > 8 Then
                Jack_Onil.Index_Texture = 0
            End If
           
            'pilih tekstur naik tangga
            Lari_NaikTangga = 1
           
        Else
            TempIB_M = Jack_Onil.IB_M
        End If
       
    End If
End Sub

16.5 Menampilkan Onil
Cara untuk menampilkan Onil ke layar monitor sedikit berbeda dari versi sebelumnya, karena tekstur yang dipakai berubah secara struktur.

Public Sub Display_Onil()

    If Jack_Onil.Life = 0 Then
        Exit Sub
    End If

    glEnable GL_BLEND
   
    glBlendFunc GL_DST_COLOR, GL_ZERO
    glBindTexture GL_TEXTURE_2D, _
                    Text_Onil_M(Lari_NaikTangga, _
                    Jack_Onil.Index_Texture)
    glBegin bmPolygon
        glTexCoord2f 0#, 0
        glVertex2i Jack_Onil.X1, Jack_Onil.Y1
       
        glTexCoord2f 1#, 0
        glVertex2i Jack_Onil.X2, Jack_Onil.Y2
       
        glTexCoord2f 1#, 1#
        glVertex2i Jack_Onil.X3, Jack_Onil.Y3
       
        glTexCoord2f 0#, 1#
        glVertex2i Jack_Onil.X4, Jack_Onil.Y4
    glEnd
   
    glBlendFunc GL_ONE, GL_ONE
    glBindTexture GL_TEXTURE_2D, _
                    Text_Onil_I(Lari_NaikTangga, _
                    Jack_Onil.Index_Texture)
    glBegin bmPolygon
        glTexCoord2f 0#, 0
        glVertex2i Jack_Onil.X1, Jack_Onil.Y1
       
        glTexCoord2f 1#, 0
        glVertex2i Jack_Onil.X2, Jack_Onil.Y2
       
        glTexCoord2f 1#, 1#
        glVertex2i Jack_Onil.X3, Jack_Onil.Y3
       
        glTexCoord2f 0#, 1#
        glVertex2i Jack_Onil.X4, Jack_Onil.Y4
    glEnd
   
    glDisable GL_BLEND
End Sub


Salam Jack Onil


Heriady
heriady.yoh@gmail.com




Artikel terkait

Membuat Game dengan VB 6