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