Jumat, 06 November 2015

Jack Onil Bab-10 Membuat Tokoh Onil

Maju selangkah lagi, itulah yang harus dilakukan bagi seorang programmer untuk terus berkembang. Setelah ogut membahas masalah timer dan matriks di dua bab sebelumnya, saatnya sekarang Anda menggunakan timer dan matriks untuk membuat tokoh Onil sebagai tokoh utama di game ini.


Sesuai dengan rancangan layout yang telah dibuat sebelumnya, Onil hanya bergerak ke kanan dan ke kiri di bagian bawah screen game. Karena hanya bergerak ke kanan dan ke kiri maka ogut memakai keyboard yaitu tombol kiri dan kanan saja, tidak diperlukan mouse untuk mengontrol gerakan Onil.

Disamping tombol kiri dan kanan ogut juga menggunakan satu tombol lain yaitu shift untuk memperlambat gerakan Onil.


10.1 Tekstur Onil
Pada saat Anda belajar tentang tehnik masking ogut telah memberi contoh program cara menampilkan tokoh Onil ke layar monitor dengan menggunakan sebuah persegipanjang yang diberi tekstur mask dan tekstur image.

Cara pemrograman seperti itu tetap dipergunakan untuk bab ini, tetapi ada sedikit perbedaan. Pada bab ini tokoh Onil yang akan ditampilkan ke layar menggunakan lebih dari satu tekstur agar tercipta animasi yang lebih baik. Ogut menggunakan sembilan tekstur image dan sembilan tekstur mask untuk program ini.

Berikut ini ogut lampirkan  cara untuk deklarasi variabel tekstur dan cara load tekstur Onil.

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

Public Function Load_All_texture() As Boolean

    ...
    ...
    ...

    'Tekstur Jack Onil(Image)
    If Not Create_Texture(Text_Onil_I(0), _
            "\Texture\Jack_Onil\Onil_0i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(1), _
            "\Texture\Jack_Onil\Onil_1i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(2), _
            "\Texture\Jack_Onil\Onil_2i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(3), _
            "\Texture\Jack_Onil\Onil_3i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(4), _
            "\Texture\Jack_Onil\Onil_4i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(5), _
            "\Texture\Jack_Onil\Onil_5i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(6), _
            "\Texture\Jack_Onil\Onil_6i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(7), _
            "\Texture\Jack_Onil\Onil_7i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_I(8), _
            "\Texture\Jack_Onil\Onil_8i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    'Tekstur Jack Onil(Mask)
    If Not Create_Texture(Text_Onil_M(0), _
            "\Texture\Jack_Onil\Onil_0m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(1), _
            "\Texture\Jack_Onil\Onil_1m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(2), _
            "\Texture\Jack_Onil\Onil_2m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(3), _
            "\Texture\Jack_Onil\Onil_3m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(4), _
            "\Texture\Jack_Onil\Onil_4m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(5), _
            "\Texture\Jack_Onil\Onil_5m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(6), _
            "\Texture\Jack_Onil\Onil_6m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(7), _
            "\Texture\Jack_Onil\Onil_7m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Onil_M(8), _
            "\Texture\Jack_Onil\Onil_8m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
                 
    'jika semua berjalan baik return true
    Load_All_texture = True
End Function

10.2 Load dan Reload Data Onil
Untuk menyimpan nilai-nilai karakteristik Onil ogut menggunakan type untuk memudahkan pemrograman.

Type Onil_Object
    X1 As Integer
    Y1 As Integer
    X2 As Integer
    Y2 As Integer
    X3 As Integer
    Y3 As Integer
    X4 As Integer
    Y4 As Integer

    dGeserX As Integer
    dGeserY As Integer

    IB_M As Integer
    IK_M As Integer

    Index_Texture As Integer

    Score As Long
    Life As Long
End Type

X1, Y1 sampai dengan X4,Y4 adalah variabel yang dipergunakan untuk menampung posisi Onil di screen game.

dGeserX dan dGeserY digunakan untuk mengubah posisi koordinat Onil, dGeserX untuk mengubah posisi searah dengan sumbu X sedangkan dGeserY untuk mengubah posisi pada sumbu Y.

IB_M digunakan untuk menampung indeks baris matriks Onil.

IK_M berguna untuk menampung indeks kolom matriks Onil.

Index_Texture berhubungan dengan subbab 10.1, variabel ini bernilai 0 sampai dengan 8, berguna sebagai  indeks array yang menyimpan tekstur image dan tekstur mask.

Score menampung nilai item logistik yang telah dikumpulkan oleh pemain.

Life digunakan sebagai penampung banyaknya nyawa yang dimiliki oleh pemain, jika Life = 0(nol) maka game over.

Public Sub Load_Onil()
    'Timer Onil
   
    'perkecil nilai TDelay agar
    'gerakan Onil lebih cepat
    Onil_TimerLR.TDelay = 50
    Onil_TimerLR.TFirst = True
   
    Jack_Onil.Life = 9
End Sub

Public Sub ReLoad_Onil()
    'posisikan Onil di tengah sumbu Y
    Jack_Onil.X1 = -75: Jack_Onil.Y1 = -900
    Jack_Onil.X2 = 75: Jack_Onil.Y2 = -900
    Jack_Onil.X3 = 75: Jack_Onil.Y3 = -600
    Jack_Onil.X4 = -75: Jack_Onil.Y4 = -600
   
    'kecepatan geser Onil
    Jack_Onil.dGeserX = 50: Jack_Onil.dGeserY = 20
   
    'baris dan kolom matriks
    Jack_Onil.IB_M = Baris_M - 1
    Jack_Onil.IK_M = Int((Kolom_M - 1) / 2)
   
    TempIB_M = Jack_Onil.IB_M
    TempIK_M = Jack_Onil.IK_M

   
    Jack_Onil.Index_Texture = 4
End Sub

Sub-sub di atas ogut buat untuk memberi nilai awal bagi karakteristik Onil. Sub ReLoad_Onil dipakai untuk mengulang pemberian nilai kepada Onil jika Onil gagal menangkap item logistik.

10.3 Tombol Kontrol
Untuk mendeteksi tombol yang ditekan oleh pemain, ogut menggunakan fungsi GetKeyState.

Proses pendeteksian keyboard sangat mudah, Anda tinggal menempatkan sebuah sub di main looping.

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
   
End Sub

Pada sub di atas terdapat sebuah tombol tambahan yaitu shift, tombol ini berguna untuk memperlambat gerakan Onil agar pemain lebih mudah mengontrol Onil.

Jika shift ditekan maka variabel Delay_Key_Onil diisi dengan nilai tertentu. Variabel ini dipakai untuk kondisi If di tombol kiri dan kanan agar tidak langsung menggerakkan Onil ke kiri dan ke kanan.

Selain tombol shift ogut juga memakai timer untuk menahan laju Onil agar tidak terlalu cepat, jika Anda ingin agar kecepatan Onil bertambah Anda tinggal memperkecil nilai TDelay pada timer Onil.

10.4 Menggerakkan Onil
Untuk menggerakkan Onil ke kiri dan ke kanan yang perlu diperhatikan adalah pergerakan Onil dibatasi oleh matriks sehingga setiap kali Onil berpindah posisi maka nilai IB_M dan IK_M harus selalu diubah sesuai dengan perpindahan yang dilakukan.

Sehingga inti dari proses memindahkan Onil adalah mengubah posisi Onil, mengubah indeks baris serta kolom matriks dan yang terakhir mengubah nilai  Index_Texture agar tercipta animasi pada saat Onil ditampilkan di layar monitor.

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
           
        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
           
        Else
            TempIK_M = Jack_Onil.IK_M
        End If
       
    End If
End Sub

10.5 Menampilkan Onil
Cara untuk menampilkan Onil ke layar monitor dengan tehnik masking telah ogut  bahas, yang terpenting adalah nilai dari Index_Texture dipakai sebagai indeks dari array yang menampung tekstur Onil.

Public Sub Display_Onil()

    'Onil yang ditampilkan ke layar jika
    'nilai Life lebih dari  0
    If Jack_Onil.Life = 0 Then
        Exit Sub
    End If

    'Tampilkan Onil ke layar dengan tehnik masking
   
    glEnable GL_BLEND
   
    glBlendFunc GL_DST_COLOR, GL_ZERO
    glBindTexture GL_TEXTURE_2D, _
            Text_Onil_M(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(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