Abis bikin Ultimate series, tiba2 gw jadi dapet ide buat bikin Note Tagging + Caching tutorial. Tutorial ini cuma buat org2 yg udah lumayan ngerti tentang scripting (termasuk class,objects, properties, modules etc.)
Note Tagging + Caching TutorialDifficulty: 3/5
Apa itu Note Tagging?Satu kelebihan VX yg gw bener2 suka adalah adanya Note Field di database, kan XP blom ada tuh. Trus knapa klo ada Note Field? Bisa dimanfaatin buat nambah2 property dari suatu object yg ada di database. Contohnya liat aja script2nya Yanfly ato script2 gw yg Ultimate series, script2 itu banyak pake Note Tagging buat mempermudah developer nambah properties baru ke database object.
Properties?Tiap variable yg ada dalam suatu object itu namanya properties. Misalnya weapon itu propertiesnya ada Attack, Defense, Name, Element, Two-handed etc, klo skill ada MP cost, Attack Factor, Spirit Factor etc. Dengan note tagging kita bisa bikin property baru yg secara default ga ada pilihannya di database. Misalnya, mau bikin skill yang ada Agility/Defense Factor? Ato mau weapon yang punya MP cost? Pengen musuh punya level? Skill bisa critical? Bikin state yang bisa nambahin Max HP/MaxMP? Bisa dibikin lewat Note Tagging.
Catatan: Note Tagging hanya berfungsi untuk membaca value untuk properties2 tambahan dari Note Field. Untuk mengimplementasikan value2 tadi ke dalam game mechanic, harus ada tambahan script2 lagi biar value2 td kepake dalam perhitungan2 dan proses2 di game. Bisa dibilang fungsi utama note tagging ini cuma mempermudah customization database, karena klo ga pake note tagging semua additional properties harus dimasukkin ke script editor. Tentu saja yang utama adalah gimana kalian membuat script yang ngebaca value2 tsb jadi berfungsi sebagaimana yg diharapkan.
Kalo Caching? Gw taunya Cacing?Sebenernya gw ga tau sih bener ga ini namanya caching, tp yg gw maksudkan disini adalah kita baca semua tambahan properties ini di saat game mulai, lalu di store ke variable2 Tujuannya? Mempercepat loading time saat game lagi berjalan, karena properties2 ini tinggal ambil dari variable, ga usah note field lagi. Note Tagging di script2 lama itu blom pake beginian, mereka tiap kali diminta value dari suatu property tambahan, mereka baca note field lagi. Process ini relatif lebih berat daripada cuma ngasih tau 1 variable yg udah kesimpen. Jadi caching ini gunanya biar process yg beratnya cuma kejadian pas game baru dimulai, biar pas game berjalan ga baca2 note field lagi. Berguna untuk komputer2 yg mungkin masih kurang kuat, kadang2 process gini bisa bikin lag.
Oke gw tau sekarang definisinya, nah gimana caranya tuh dua2nya?Note Tagging:
Untuk Note Tagging, gw biasa pake
Regular Expression comparison, dan untuk Multiple value tags, gw juga pake String operation
gsubRegular Expression: Built in Function dimana kita bisa nyocokkin sebuah String dengan Regular Expression. Buat lebih jelasnya, cek di sini.
Contoh Regular Expression:
- Code:
-
#Sytaxnya: string[/regexp/]
#Misalnya gw pengen nyari tag dengan nama test_tag, dan harus punya 1 value berupa integer, dan harus ditutup dengan # tanda <>
#Pake regexpnya kyk gini: <test_tag\s+[0-9]+>
#Contoh dari tag2 yang salah + 1 tag yg bener, biarpun mirip, tag yg salah format ga bkl kebaca.
string = "<test_tag2 30>\r\n<test_tag>\r\ntest_tag 50>\r\n<test_tag 50>"
result = string[/<test_tag\s+[0-9]+>/] #=> "<test_tag 50>"
#Untuk dapetin value dari result itu, kita pake regexp lagi buat ngambil valuenya doang
value = result[/\s[0-9]+/].to_i #=> 50
Dengan cara yg sama, kita bisa ngambil value untuk properties tambahan dari note field.
String Operation gsub: Mirip2 kayak regexp diatas, tapi kalo regxp cuma nyocokkin sama yg ketemu pertama kali, kalo ini nyocokin berkali2 sampe stringnya abis. Gunanya untuk Multiple value tag, kita cocokkin value berkali2 trus masing2 value dimasukkin ke array.
Contoh gsub:
- Code:
-
#Sytaxnya: string.gsub(regexp){|match| statements}
#Misalnya gw pengen nyari tag dengan nama test_tag, dan harus punya 4 value berupa integer, dan harus ditutup dengan #tanda <>
#Pake regexpnya kyk gini: <test_tag(\s+[0-9]+){4}>
string = "<test_tag 3 20 100>\r\n<test_tag 4 4 5 8 2>\r\n<test_tag 50 3 3 60>"
result = string[/<test_tag(\s+[0-9]+){4}>/] #=> "<test_tag 50 3 3 60>"
#Untuk dapetin value dari result itu, kita pake gsub
values = []
result.gsub(/[0-9]+/){|match| values.push(match.to_i)} #[50, 3, 3, 60]
Nah trus gimana dong cara buat ngebacanya dari Note Field?Nih lgsg contoh aja:
- Code:
-
#Untuk ngambil properties dari note field, ada 3 hal yg harus ditentukan dulu:
#-method call-nya
#-Format Tag-nya
#-Return data type nya.
#Misalnya kita pengen bikin weapon punya critical hit rate sendiri.
#-Method call: Biar sama kyk actor, namain aja 'cri'
#-Format tagnya: <critical_rate value>
#-Return data typenya: Integer
#Nah kira2 jadi kyk gini codingnya:
module RPG #Module yg meliputi game database
class Weapon #Weapon objects itu classnya ini.
def cri #Method call
temp = self.note[/<critical_rate\s+[0-9]+>/] #Cek ada tag format yang cocok ga
if temp != nil #Kalo ada
return temp[/[0-9]+/].to_i #Ambil valuenya trus dijadiin return value.
else #Kalo ga ada
return 4 #Default value kalo ga ada tag.
end
end
end
end
#Dengan begitu, tiap kali kita panggil line kyk gini:
$data_weapons[ID].cri
#Bakal ngebaca note field buat weapon itu, trus ngasih value sesuai sama apa yg didapet dari proses di atas.
Hasil dari value diatas, biarpun ada valuenya, ga ada gunanya sama sekali, karena kita blom bikin script buat masukkin value td ke game mechanicnya. Nah sekarang cara biar critical rate yg udah kita dapet td bener2 jadi ngaruh ke gamenya, kita bikin script tambahan lagi.
- Code:
-
class Game_Actor
alias example_note_tag_cri cri unless $@ #Aliasing method call 'cri' untuk actor.
def cri
result = example_note_tag_cri #Ambil value dari critical rate asli actornya.
for weapon in weapons.compact #Looping utuk senjata2 yg diequip.
result += weapon.cri #.cri => method call untuk ngebaca value dari note field
end
end
end
Itu tadi cuma contoh, aplikasi Note Tagging ini luas banget, bisa dipake banyak hal. Coba cek help filenya RMVX tentang regular expression. Buat contoh2 penggunaan Note Tagging, cekCS:Ultimate series atoYanfly engine, yg punya Yanfly mungkin agak beda sama yg gw kasih disini tapi initnya ga jauh beda.
Nah itu tadi kan Note Tagging, kalo Caching?Tadi itu Note Tagging konvensional, sistem kyk gitu tiap kali diminta value, mereka bakal ngulang baca note field lagi, ngelakuin Regexp operation lagi baru ngasih valuenya. Prosess ini relatif lebih berat (ga pernah kerasa sih di gw, tp klo komputer yg dipake kurang kuat mgkin bisa jd lag), bisa2 mengganggu gameplay klo gitu. Nah biar ga mengganggu gameplay, kita baca dulu semua tag yang ada di semua object, trus dimasukkin ke variable2. Loh klo baca semua sekaligus malah tambah berat dong? Emang, tapi kalo kita bikin processnya pas awal game baru mulai(sebelum title screen), ga gitu masalah dong kalo ngelag
Daripada tengah2 maen game jd ngelag kan? Nah setelah semua additional propertues nasuk ke variable2, pas dibutuhin tinggal minta value dari variable aja, ga perlu baca note field lagi.
Contoh caching:
- Code:
-
#Pertama2 kita tentuin dulu property tambahan yg kita butuh apa aja.
#Misalnya gw mau bikin skill punya Agility F, Defense F, sama critical rate
#Kita bikin 1 method yg bakal dipanggil untuk semua skill waktu game baru mulai.
module RPG #module yg meliputi game database
class Skill #Skill object masuk ke class ini.
def create_example_cache #Method call buat bikin cache.
temp = self.note[/<agi_f\s+[0-9]+>/] #cek punya tag buat Agility F ga?
if temp != nil #klo punya
@agi_f = temp[/[0-9]+/].to_i #Simpen value ke variable @agi_f
else #klo ga punya
@agi_f = 0 #default value
end
temp = self.note[/<def_f\s+[0-9]+>/] #cek punya tag buat Defense F ga?
if temp != nil #klo punya
@def_f = temp[/[0-9]+/].to_i #Simpen value ke variable @def_f
else #klo ga punya
@def_f = 0 #default value
end
temp = self.note[/<crit_rate\s+[0-9]+>/] #cek punya tag buat Crit Rate ga?
if temp != nil #klo punya
@cri = temp[/[0-9]+/].to_i #Simpen value ke variable @cri
else #klo ga punya
@cri = 0 #default value
end
end
attr_accessor :agi_f
attr_accessor :def_f
attr_accessor :cri
end
class Scene_Title
alias example_caching_load_db load_database
def load_database #Method call untuk load database
example_caching_load_db
for skill in $data_skills
next if skill == nil
skill.create_example_cache #Bikin cache untuk semua skill.
end
end
end
#Dengan begini, setiap kali kita masuk scene title, additional properties bakal dibikin berbarengan sama database loading.
Ini cuma salah satu teknik untuk caching, yg bermaksud buat bener2 meminimalisir lag saat game berlangsung, dengan kompensasi semua lagnya bakal kekumpul waktu game start(klo emang ngelag, gw sih fine2 aja.) Ada juga yg baru baca note field klo pas value variable itu diminta, variable tsb blom ada valuenya. Cek Yanfly punya buat yang ini.
Hoo gitu, tapi kok gw masih ga ngerti ya?Klo agak susah dimengerti, bisa cek script2 yang bnyk pake note tagging, misalnya:
-CS:Ultimate series => Tutorial ini berdasarkan note tagging dan caching yg gw pake di script ini.
-Yanfly engine => Alternatif cara note tagging dan caching dari apa yg gw kasih disini.
-Tutorial Regexp
-Help file RPG Maker VX
Sekian deh tutorial gw, semoga membantu scripter2 disini deh