Minggu, 08 November 2015

Jack Onil Bab-17 Bonus

Setelah pada bab sebelumnya ogut menambahkan pesawat untuk menjatuhkan item logistik, tahap selanjutnya ogut ingin menambahkan bonus pada game ini.


Penambahan bonus berguna untuk memperpanjang masa hidup pemain dan memperbesar nilai score agar tercipta kompetisi antara pemain yang satu dengan pemain yang lain.

Bonus ogut buat menjadi dua macam yaitu bonus hati(life) dan bonus score, baik bonus hati maupun bonus score masing-masing terdiri dari dua macam.


17.1 Matriks Bonus
Pembuatan bonus masih memakai matriks berordo 70x29 seperti sebelumnya, hanya terdapat perbedaan pada saat bonus jatuh.

Bonus akan berhenti bergerak bila bonus berada di posisi matriks yang berelemen 1. Dengan kondisi seperti ini ogut dapat membuat bonus berhenti di udara selama beberapa saat, jika bonus tidak diambil oleh pemain maka bonus akan hilang.

17.2 Tekstur
Pembuatan bonus memerlukan tekstur  sebanyak empat buah dan sebuah tekstur pesawat yang bertugas untuk menjatuhkan bonus.

Public Function Load_All_texture() As Boolean
    ...
    ...
    ...

    'Tekstur Bonus Hati
    If Not Create_Texture(Text_Bonus_I(0), _
        "\Texture\Bonus\3hati_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Bonus_I(1), _
        "\Texture\Bonus\6hati_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    If Not Create_Texture(Text_Bonus_M(0), _
        "\Texture\Bonus\3hati_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Bonus_M(1), _
        "\Texture\Bonus\6hati_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    'Tekstur Bonus Score
    If Not Create_Texture(Text_Bonus_I(2), _
        "\Texture\Bonus\25score_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Bonus_I(3), _
        "\Texture\Bonus\50score_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    If Not Create_Texture(Text_Bonus_M(2), _
        "\Texture\Bonus\25score_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
    If Not Create_Texture(Text_Bonus_M(3), _
        "\Texture\Bonus\50score_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    'Tekstur pesawat bonus(image)
    If Not Create_Texture(Text_PlaneBonus_I, _
        "\Texture\Bonus\pesawatbonus_i.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
   
    'Tekstur pesawat bonus(mask)
    If Not Create_Texture(Text_PlaneBonus_M, _
        "\Texture\Bonus\pesawatbonus_m.bmp") Then
        Load_All_texture = False
        Exit Function
    End If
                 
    'jika semua berjalan baik return true
    Load_All_texture = True
End Function

17.3 Membuat Pesawat Bonus
Pembuatan pesawat yang menjatuhkan bonus pada intinya sama saja dengan pembuatan pesawat yang menjatuhkan item logistik. Memakai Timer_Isi_Bonus untuk mengatur proses penjatuhan bonus secara berkala.

Proses penjatuhan bonus tidak seperti item logistik, pada item logistik timer untuk menjatuhkan dan timer untuk kecepatan laju bertambah secara bertahap dari waktu ke waktu sejalan dengan bertambahnya level. Pada bonus hal itu tidak berlaku, bonus yang dijatuhkan dan kecepatan bonus untuk jatuh bebas tetap selama game berjalan.

Di bawah ini adalah sub yang ogut buat untuk mengaktifkan pesawat bonus, sub untuk menggerakkan pesawat bonus dari kiri ke kanan, dan sub untuk menampilkan pesawat ke layar monitor.

Public Sub Aktifkan_PlaneBonus()
        'posisi koordinat awal pesawat bonus
        PlaneBonus.X1 = -1050
        PlaneBonus.Y1 = 200
       
        PlaneBonus.X2 = -850
        PlaneBonus.Y2 = PlaneBonus.Y1
       
        PlaneBonus.X3 = PlaneBonus.X2
        PlaneBonus.Y3 = PlaneBonus.Y1 + 100
       
        PlaneBonus.X4 = PlaneBonus.X1
        PlaneBonus.Y4 = PlaneBonus.Y3
       
        'timer kecepatan pesawat bonus
        '(timer tidak berubah selama game berjalan)
        PlaneBonus.GO_Timer.TDelay = 50
        PlaneBonus.GO_Timer.TGetFirst = True
       
        'baris dan kolom matriks pesawat bonus
        PlaneBonus.IB_M = 30
        PlaneBonus.IK_M = -5
       
        'nilai pergeseran pesawat bonus
        PlaneBonus.dGeserX = 50
       
        PlaneBonus.Active_Flag = 1
       
        'isi nilai random 0 atau 1
        Randomize
        Random_Bonus = Int((10 * Rnd) + 0)
       
        'nilai random 5 sampai dengan 9
        'berarti bonus score yang akan keluar
        If Random_Bonus > 4 Then
            'kolom bonus score di posisi
            'kolom terakhir matriks
            Random_Bonus = Kolom_M - 1
        Else
            'kolom bonus lifes
            'di kolom pertama matriks
            Random_Bonus = 0
        End If
       
End Sub

Public Sub Move_PlaneBonus()

    'jika pesawat sedang aktif
    'maka pesawat bisa digerakkan
    If PlaneBonus.Active_Flag = 0 Then
        Exit Sub
    End If
   
    If My_Timer(PlaneBonus.GO_Timer) Then
        'geser pesawat ke kanan
        PlaneBonus.X1 = PlaneBonus.X1 + _
                            PlaneBonus.dGeserX
        PlaneBonus.X2 = PlaneBonus.X2 + _
                            PlaneBonus.dGeserX
        PlaneBonus.X3 = PlaneBonus.X3 + _
                            PlaneBonus.dGeserX
        PlaneBonus.X4 = PlaneBonus.X4 + _
                            PlaneBonus.dGeserX
       
        'geser posisi indeks kolom pesawat
        PlaneBonus.IK_M = PlaneBonus.IK_M + 1
       
        'jika posisi pesawat tepat di atas posisi
        'bonus jatuh, maka jatuhkan bonus
        If PlaneBonus.IK_M = Random_Bonus Then
            Aktifkan_Bonus
        End If
   
    End If
   
    If PlaneBonus.X1 > Xmax Then
        'pesawat keluar dari layar
        'maka pesawat dinonaktifkan
        PlaneBonus.Active_Flag = 0
    End If
       
       
End Sub

Public Sub Display_PlaneBonus()

    If PlaneBonus.Active_Flag = 0 Then
        Exit Sub
    End If

    glEnable GL_BLEND
   
    glBlendFunc GL_DST_COLOR, GL_ZERO
    glBindTexture GL_TEXTURE_2D, Text_PlaneBonus_M
    glBegin bmPolygon
        glTexCoord2f 0#, 0
        glVertex2i PlaneBonus.X1, PlaneBonus.Y1
       
        glTexCoord2f 1#, 0
        glVertex2i PlaneBonus.X2, PlaneBonus.Y2
       
        glTexCoord2f 1#, 1#
        glVertex2i PlaneBonus.X3, PlaneBonus.Y3
       
        glTexCoord2f 0#, 1#
        glVertex2i PlaneBonus.X4, PlaneBonus.Y4
    glEnd
   
    glBlendFunc GL_ONE, GL_ONE
    glBindTexture GL_TEXTURE_2D, Text_PlaneBonus_I
    glBegin bmPolygon
        glTexCoord2f 0#, 0
        glVertex2i PlaneBonus.X1, PlaneBonus.Y1
       
        glTexCoord2f 1#, 0
        glVertex2i PlaneBonus.X2, PlaneBonus.Y2
       
        glTexCoord2f 1#, 1#
        glVertex2i PlaneBonus.X3, PlaneBonus.Y3
       
        glTexCoord2f 0#, 1#
        glVertex2i PlaneBonus.X4, PlaneBonus.Y4
    glEnd
   
    glDisable GL_BLEND
   
End Sub

Pada sub Render_Objek ogut tambahkan kondisi If untuk mengaktifkan pesawat bonus.

Private Sub Render_Objek()
    Dim i As Integer
    glClear clrColorBufferBit Or _
            clrDepthBufferBit
    glLoadIdentity
   
    'Timer Level
    If My_Timer(Timer_Level) Then
        Level_Meningkat
    End If
   
    Display_BG
   
    'Pesawat IL
    If My_Timer(Timer_Isi_IL) Then
            Aktifkan_PlaneIL
    End If
       
    For i = 0 To Max_IL - 1
        Move_IL i
        Onil_Tangkap_IL i
        Display_IL i
    Next
   
    'Bonus
    If My_Timer(Timer_Isi_Bonus) Then
        Aktifkan_PlaneBonus
    End If
   
    For i = 0 To Max_Bonus - 1
        Move_Bonus i
        Onil_Tangkap_Bonus i
        Display_Bonus i
    Next
   
    Move_PlaneIL
    Display_PlaneIL
   
    Move_PlaneBonus
    Display_PlaneBonus
   
    Display_Onil
   
    Display_Score
    Display_Angka -500, 850, Jack_Onil.Jack_Onil.Score
   
    Display_Life
    Display_Angka 600, 850, Jack_Onil.Jack_Onil.Life
End Sub

17.4 Membuat Bonus
Pembuatan objek bonus hampir sama dengan pembuatan objek item logistik, yang berbeda bonus terdiri dari empat macam.

Untuk membedakan empat macam bonus ogut menggunakan variabel ID yang ada pada type Game_Object. Pada saat bonus diaktifkan ID ogut isi dengan nilai acak, sehingga bonus yang muncul pada saat game berjalan tidak bisa ditebak.

Sama seperti item logistik bonus dijatuhkan oleh pesawat jika posisi pesawat berada tepat di indeks kolom matriks tempat bonus jatuh.

Public Sub Aktifkan_Bonus()
    Dim i As Integer
    Dim temp_KM As Integer
   
    For i = 0 To Max_Bonus - 1
        If Bonus(i).Active_Flag = 0 Then
       
            Bonus(i).dGeserX = 0
            Bonus(i).dGeserY = 20
           
            'isi indeks baris matriks
            Bonus(i).IB_M = 30
           
            'isi indeks kolom matriks dengan
            'nilai hasil random
            Bonus(i).IK_M = Random_Bonus
           
            'Bonus Hati
            If Random_Bonus = 0 Then
                'posisi awal bonus hati jatuh
                Bonus(i).X1 = -740
                Bonus(i).Y1 = 150
               
                Bonus(i).X2 = -660
                Bonus(i).Y2 = 150
               
                Bonus(i).X3 = Bonus(i).X2
                Bonus(i).Y3 = Bonus(i).Y1 + TinggiP_IL
               
                Bonus(i).X4 = Bonus(i).X1
                Bonus(i).Y4 = Bonus(i).Y2 + TinggiP_IL
               
                'isi ID untuk Bonus hati 0 atau 1
                Randomize
                Bonus(i).ID = Int((10 * Rnd) + 0)
               
                If Bonus(i).ID > 4 Then
                    Bonus(i).ID = 1 '6 hati
                Else
                    Bonus(i).ID = 0 '3 hati
                End If
               
            End If
           
            'Bonus Score
            If Random_Bonus = (Kolom_M - 1) Then
                'posisi awal bonus score jatuh
                Bonus(i).X1 = 660
                Bonus(i).Y1 = 150
               
                Bonus(i).X2 = 740
                Bonus(i).Y2 = 150
               
                Bonus(i).X3 = Bonus(i).X2
                Bonus(i).Y3 = Bonus(i).Y1 + TinggiP_IL
               
                Bonus(i).X4 = Bonus(i).X1
                Bonus(i).Y4 = Bonus(i).Y2 + TinggiP_IL
               
                'isi ID untuk Bonus score 2 atau 3
                Randomize
                Bonus(i).ID = Int((10 * Rnd) + 0)
               
                If Bonus(i).ID > 4 Then
                    Bonus(i).ID = 3 '5000 score
                Else
                    Bonus(i).ID = 2 '2500 Score
                End If
               
            End If
       
            Bonus(i).Index_Texture = Bonus(i).ID
           
            Bonus(i).GO_Timer.TDelay = 50
            Bonus(i).GO_Timer.TGetFirst = True
           
            Bonus(i).Active_Flag = 1

            'sound Bonus jatuh
            Play_Sound1
           
            Exit For
        End If
    Next
End Sub

Seperti yang telah ogut ungkapkan sebelumnya bonus akan berhenti jatuh ke bawah jika berada di elemen matriks yang bernilai 1, dan bonus akan diam selama lima detik sebelum hilang dari pandangan pemain.

Public Sub Move_Bonus(i_p As Integer)

    If Bonus(i_p).Active_Flag = 0 Then
        Exit Sub
    End If
   
    If My_Timer(Bonus(i_p).GO_Timer) Then
   
        If Bonus(i_p).dGeserY <> 0 Then
            'baris bertambah karena
            'bonus bergerak turun
            Bonus(i_p).IB_M = Bonus(i_p).IB_M + 1
       
            'update posisi koordinat bonus
            Bonus(i_p).Y1 = Bonus(i_p).Y1 - _
                                Bonus(i_p).dGeserY
            Bonus(i_p).Y2 = Bonus(i_p).Y2 - _
                                Bonus(i_p).dGeserY
            Bonus(i_p).Y3 = Bonus(i_p).Y3 - _
                                Bonus(i_p).dGeserY
            Bonus(i_p).Y4 = Bonus(i_p).Y4 - _
                                Bonus(i_p).dGeserY
        Else
            'waktu bonus telah habis
            'bonus hilang dari layar monitor
            Bonus(i_p).Active_Flag = 0
        End If
       
    End If
   
    'bonus sampai di tujuan(elemen matriks = 1)
    If Matriks_Onil(Bonus(i_p).IB_M, _
                        Bonus(i_p).IK_M) = 1 Then
       
        'bonus tidak dapat turun lagi
        Bonus(i_p).dGeserY = 0
       
        'supaya bonus menunggu 5 detik,
        'jika bonus tidak diambil dalam
        'waktu 5 detik bonus akan hilang
        Bonus(i_p).GO_Timer.TDelay = 5000
    End If
   
End Sub

Cara untuk menampilkan bonus di layar monitor hampir sama dengan cara menampilkan item logistik, tetapi bonus tidak akan berwarna merah dalam kondisi apapun.

Public Sub Display_Bonus(i_p As Integer)

    If Bonus(i_p).Active_Flag = 0 Then
        Exit Sub
    End If

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

17.5 Deteksi Tabrakan Bonus
Deteksi tabrakan antara Onil dan bonus tetap menggunakan matriks berordo 70x29, jika posisi Onil dan posisi bonus berada di indeks baris dan indeks kolom yang sama, maka tabrakan terjadi.

Public Sub Onil_Tangkap_Bonus(i_p As Integer)
   
    'Bonus aktif yang dideteksi
    If Bonus(i_p).Active_Flag = 0 Then
        Exit Sub
    End If
   
    'jika indeks baris dan indeks kolom Onil sama
    'dengan indeks baris dan indeks kolom bonus,
    'Onil berhasil menangkap bonus
    If Bonus(i_p).IB_M = Jack_Onil.Jack_Onil.IB_M _
                And _
        Bonus(i_p).IK_M = Jack_Onil.Jack_Onil.IK_M _
                Then
       
        'Onil tangkap bonus
        Select Case Bonus(i_p).ID
            Case 0
                'bonus 3 hati
                Jack_Onil.Jack_Onil.Life = _
                    Jack_Onil.Jack_Onil.Life + 3
               
           Case 1
                'bonus 6 hati
                Jack_Onil.Jack_Onil.Life = _
                    Jack_Onil.Jack_Onil.Life + 6
               
           Case 2
                'bonus 2500 score
                Jack_Onil.Jack_Onil.Score = _
                    Jack_Onil.Jack_Onil.Score + 2500
         
           Case 3
                'bonus 5000 score
                Jack_Onil.Jack_Onil.Score = _
                    Jack_Onil.Jack_Onil.Score + 5000
         
        End Select
     
        Bonus(i_p).Active_Flag = 0
       
        Play_Sound4
       
    End If
   
End Sub


Salam Jack Onil


Heriady
heriady.yoh@gmail.com




Artikel terkait

Membuat Game dengan VB 6

Tidak ada komentar:

Posting Komentar