Jumat, 06 November 2015

Jack Onil Bab-11 Item Logistik

Sesuai dengan rancangan game yang telah dibuat sebelumnya, tahap berikutnya yang harus dilakukan  adalah membuat item logistik(IL).


IL adalah bantuan logistik yang dijatuhkan dari udara, dan IL harus ditangkap oleh Onil sebelum menyentuh tanah.


11.1 Tekstur Item Logistik
Ogut menggunakan enam buah tekstur  untuk IL agar game terlihat lebih penuh warna. Dan sama seperti tokoh Onil tehnik masking diperlukan untuk menampilkan IL ke screen game, sehingga tekstur image dan tekstur mask dibutuhkan.

Public Function Load_All_texture() As Boolean

    ...              
    ...  
    ...
   
    'Item Logistik (Image)
    If Not Create_Texture(Text_IL_I(0), _
            "\Texture\Item_Logistik\bola_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_I(1), _
            "\Texture\Item_Logistik\mug_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_I(2), _
            "\Texture\Item_Logistik\ban_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_I(3), _
            "\Texture\Item_Logistik\kaos_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_I(4), _
            "\Texture\Item_Logistik\box_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_I(5), _
            "\Texture\Item_Logistik\topi_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    'Item Logistik (Mask)
    If Not Create_Texture(Text_IL_M(0), _
            "\Texture\Item_Logistik\bola_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_M(1), _
            "\Texture\Item_Logistik\mug_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_M(2), _
            "\Texture\Item_Logistik\ban_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_M(3), _
            "\Texture\Item_Logistik\kaos_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_M(4), _
            "\Texture\Item_Logistik\box_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_IL_M(5), _
            "\Texture\Item_Logistik\topi_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
                 
    'jika semua berjalan baik return true
    Load_All_texture = True
End Function

11.2 Aktifkan Item Logistik
Item logistik atau IL memerlukan timer agar bisa tampil secara berkala. Untuk mendukung ini ogut memakai timer dan sub Aktifkan_IL agar bisa membuat IL tampil di layar monitor secara sempurna.

Sebelum ogut menerangkan cara menampilkan IL, terlebih dahulu ogut akan menerangkan type yang ogut susun buat IL.

Type Game_Object
    ID As Integer
   
    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 Integer
    Active_Flag As Integer
    Red_Flag As Integer

    GO_Timer As Object_Timer
End Type

Type untuk IL hampir sama dengan type yang ogut gunakan untuk Jack Onil, hanya terdapat beberapa perbedaan.

ID ogut siapkan untuk tahap berikutnya, pada bagian lain ogut akan menggunakan variabel ini.

Score pada IL digunakan untuk menambah nilai score ke pemain jika pemain berhasil menangkap IL.

Active_Flag bernilai 1 jika IL sedang aktif, jika tidak maka variabel ini  bernilai 0(nol).

Red_Flag, jika isi variabel ini bernilai 1 maka IL akan ditampilkan berwarna merah di screen game.

GO_Timer dipakai sebagai timer kecepatan IL jatuh, semakin kecil nilai TDelay pada timer maka semakin cepat bagi IL untuk turun ke bawah.

Sedangkan variabel yang lain fungsinya sama dengan yang dipakai pada tokoh Onil.

Untuk mengaktifkan IL secara berkala ogut menggunakan timer.

Public Sub Load_GO_Timer()
    'timer aktifkan IL
    Timer_Isi_IL.TDelay = 500 'dalam milidetik
    Timer_Isi_IL.TGetFirst = True
End Sub

Pada sub Render_Objek Timer_Isi_IL di atas ogut tempatkan sebagai berikut.

Private Sub Render_Objek()
    Dim i As Integer
    glClear clrColorBufferBit Or _
            clrDepthBufferBit
    glLoadIdentity
   
    Display_BG
   
    'Item Logistik
    If My_Timer(Timer_Isi_IL) Then
            Aktifkan_IL
    End If
       
    For i = 0 To Max_IL - 1
        Move_IL i
        Display_IL i
    Next
   
    Display_Onil
   
End Sub

Dengan penggunaan If di atas maka setiap selang waktu tertentu IL diaktifkan.

Cara mengaktifkan IL dapat dilakukan dengan menggunakan sub di bawah ini.

Public Sub Aktifkan_IL()
    Dim i As Integer
    Dim temp_KM As Integer
   
    For i = 0 To Max_IL - 1
        If IL(i).Active_Flag = 0 Then
       
            'posisikan IL di tengah sumbu Y
            IL(i).X1 = -Int(LebarP_IL / 2)
            IL(i).Y1 = 750
           
            IL(i).X2 = Int(LebarP_IL / 2)
            IL(i).Y2 = 750
           
            IL(i).X3 = IL(i).X2
            IL(i).Y3 = 750 + TinggiP_IL
           
            IL(i).X4 = IL(i).X1
            IL(i).Y4 = 750 + TinggiP_IL
   
            'jarak untuk menggeser IL sesuai
            'dengan sumbu X atau Y
            IL(i).dGeserX = 50
            IL(i).dGeserY = 20
           
            'indeks baris matriks diisi dengan
            'baris paling atas
            IL(i).IB_M = 0
           
            'random indeks kolom matriks
            '(isi dengan nilai 0 sampai dengan 69)
            IL(i).IK_M = Int((Kolom_M * Rnd) + 0)
       
            ''''''''''''''''''''''''''''''''''''''''''
            'Update posisi IL sesuai dengan nilai IK_M
            ''''''''''''''''''''''''''''''''''''''''''
           
            'nilai tengah kolom matriks
            temp_KM = Int((Kolom_M - 1) / 2)
   
            If IL(i).IK_M <> temp_KM Then
                If temp_KM > IL(i).IK_M Then
                    'di sebelah kiri sumbu Y
                    temp_KM = temp_KM - IL(i).IK_M
                   
                    'geser posisi IL ke kiri
                    IL(i).X1 = IL(i).X1 - _
                            (temp_KM * IL(i).dGeserX)
                           
                    IL(i).X2 = IL(i).X2 - _
                            (temp_KM * IL(i).dGeserX)
                           
                    IL(i).X3 = IL(i).X3 - _
                            (temp_KM * IL(i).dGeserX)
                           
                    IL(i).X4 = IL(i).X4 - _
                            (temp_KM * IL(i).dGeserX)
                Else
           
                    'di sebelah kanan sumbu Y
                    temp_KM = IL(i).IK_M - temp_KM
       
                    'geser posisi IL ke kanan
                    IL(i).X1 = IL(i).X1 + _
                            (temp_KM * IL(i).dGeserX)
                           
                    IL(i).X2 = IL(i).X2 + _
                            (temp_KM * IL(i).dGeserX)
                           
                    IL(i).X3 = IL(i).X3 + _
                            (temp_KM * IL(i).dGeserX)
                           
                    IL(i).X4 = IL(i).X4 + _
                            (temp_KM * IL(i).dGeserX)
                End If
            End If
   
            'isi Index_Texture secara acak
            Randomize
            IL(i).Index_Texture = Int((Max_IL_V * Rnd) + 0)
           
            'Timer IL untuk jatuh diatur disini
            'makin kecil nilai TDelay maka makin
            'cepat IL turun ke bawah
            IL(i).GO_Timer.TDelay = 50
            IL(i).GO_Timer.TGetFirst = True
           
            IL(i).Score = 50
            IL(i).Active_Flag = 1
            IL(i).Red_Flag = 0
           
            'proses aktifkan IL selesai,
            'maka keluar dari looping
            Exit For
        End If
    Next
End Sub

Di dalam sub di atas terdapat sebuah For...Next, dan setiap kali looping diperiksa apakah Active_Flag IL bernilai 0(nol), jika benar maka  karakteristik IL diisi dengan nilai-nilai tertentu dan yang terpenting Active_Flag diisi dengan 1 agar bisa tampil di screen game.

11.3 Menggerakkan Item Logistik
Sifat dari IL adalah bergerak turun ke bawah(jatuh bebas), untuk membuat IL bergerak turun caranya mudah yaitu dengan mengurangi koordinat Y(Y1 sampai dengan Y4) IL dengan nilai dGeserY dan menambah indeks baris matriks(IB_M) dengan nilai 1.

Pada saat IL diaktifkan IB_M diisi dengan 0(nol), dan pada saat IL bergerak turun IB_M ditambah 1 agar pergerakan dari IL sesuai dengan matriks Onil yang sebelumnya telah kita buat.

Public Sub Move_IL(i_p As Integer)

    'IL yang digerakkan hanya IL yang aktif
    If IL(i_p).Active_Flag = 0 Then
        Exit Sub
    End If
   
    If My_Timer(IL(i_p).GO_Timer) Then
   
        IL(i_p).IB_M = IL(i_p).IB_M + 1
       
        'IL telah melewati baris matriks
        'sehingga harus di nonaktifkan
        If IL(i_p).IB_M = Baris_M + 10 Then
            IL(i_p).Active_Flag = 0
            Exit Sub
        End If
       
        'geser posisi IL ke bawah
        IL(i_p).Y1 = IL(i_p).Y1 - IL(i_p).dGeserY
        IL(i_p).Y2 = IL(i_p).Y2 - IL(i_p).dGeserY
        IL(i_p).Y3 = IL(i_p).Y3 - IL(i_p).dGeserY
        IL(i_p).Y4 = IL(i_p).Y4 - IL(i_p).dGeserY
    End If
   
End Sub

11.4 Menampilkan Item Logistik
Cara menampilkan objek IL sama dengan objek Onil yaitu dengan menggunakan tehnik masking.

Index_Texture diisi secara acak agar IL yang jatuh bervariasi. Jika IL telah melewati jangkauan Onil IL akan berwarna merah, pewarnaan ini untuk memudahkan pemain berinteraksi dengan game. Perubahan IL menjadi merah akan ogut terangkan pada bab berikutnya pada saat ogut membahas proses deteksi tabrakan.

Public Sub Display_IL(i_p As Integer)

    'tampilkan hanya IL yang aktif
    If IL(i_p).Active_Flag = 0 Then
        Exit Sub
    End If

    '
    glEnable GL_BLEND
   
    glBlendFunc GL_DST_COLOR, GL_ZERO
    glBindTexture GL_TEXTURE_2D, _
                Text_IL_M(IL(i_p).Index_Texture)
    glBegin bmPolygon
        glTexCoord2f 0#, 0
        glVertex2i IL(i_p).X1, IL(i_p).Y1
       
        glTexCoord2f 1#, 0
        glVertex2i IL(i_p).X2, IL(i_p).Y2
       
        glTexCoord2f 1#, 1#
        glVertex2i IL(i_p).X3, IL(i_p).Y3
       
        glTexCoord2f 0#, 1#
        glVertex2i IL(i_p).X4, IL(i_p).Y4
    glEnd
   
    'membuat IL berwarna merah
    'IL yang berwarna merah tidak bisa
    'ditangkap Onil lagi
    If IL(i_p).Red_Flag = 1 Then
        glColor3f 1#, 0#, 0#
    End If
   
    glBlendFunc GL_ONE, GL_ONE
    glBindTexture GL_TEXTURE_2D, _
                Text_IL_I(IL(i_p).Index_Texture)
    glBegin bmPolygon
        glTexCoord2f 0#, 0
        glVertex2i IL(i_p).X1, IL(i_p).Y1
       
        glTexCoord2f 1#, 0
        glVertex2i IL(i_p).X2, IL(i_p).Y2
       
        glTexCoord2f 1#, 1#
        glVertex2i IL(i_p).X3, IL(i_p).Y3
       
        glTexCoord2f 0#, 1#
        glVertex2i IL(i_p).X4, IL(i_p).Y4
    glEnd
   
    glDisable GL_BLEND
   
    'menetralkan warna merah
    glColor3f 1#, 1#, 1#
End Sub


Salam Jack Onil


Heriady
heriady.yoh@gmail.com




Artikel terkait

Membuat Game dengan VB 6