ruby rgss3

31
11 1 RUBY 1.1 Basic 1.1.1 Input output puts ‘tulis sesuatu di sini’ Command ini menampilkan: tulis sesuatu disini Dapat diganti dengan p print ‘tulis sesuatu di sini’ Command ini menampilkan: tulis sesuatu disini Perbedaan dengan puts adalah, command print tidak ganti baris. gets() command ini digunakan untuk membari input pada suatu variable contoh: name= gets() pada command diatas input akan diminta untuk dimasukan pada variable name \n \t Command \n untuk ganti line Sedangkan \t untuk ganti tab #{} Digunakan untuk memanggil suatu nilai variable atau nilai suatu perhitungan Double quote dan single quote Double quote dapat digunakan untuk menampilkan variable Sedangkan single quote menampilkan isi apa adanya Tipe variabel .to_f convert bilangan ke tipe "float" .to_s convert bilangan ke tipe "string" .to_i convert bilangan ke tipe "integer" Contoh: var=var.to_f 1.1.2 Operator Basic operator = set + tambah - kurang * kali / bagi % sisa contoh : 20%3 = 2 += var = var + nilai -= var = var - nilai *= var = var * nilai /= var = var / nilai %= var = var % nilai

Upload: aganis-hendrian-putra

Post on 23-Oct-2015

153 views

Category:

Documents


13 download

DESCRIPTION

tutorial Ruby Rgss3for rmvxace

TRANSCRIPT

Page 1: Ruby Rgss3

1‐1  

1 RUBY

1.1 Basic

1.1.1 Input output puts ‘tulis sesuatu di sini’ Command ini menampilkan: tulis sesuatu disini Dapat diganti dengan p print ‘tulis sesuatu di sini’ Command ini menampilkan: tulis sesuatu disini Perbedaan dengan puts adalah, command print tidak ganti baris. gets() command ini digunakan untuk membari input pada suatu variable contoh: name= gets() pada command diatas input akan diminta untuk dimasukan pada variable name \n \t Command \n untuk ganti line Sedangkan \t untuk ganti tab #{} Digunakan untuk memanggil suatu nilai variable atau nilai suatu perhitungan Double quote dan single quote Double quote dapat digunakan untuk menampilkan variable Sedangkan single quote menampilkan isi apa adanya Tipe variabel .to_f convert bilangan ke tipe "float" .to_s convert bilangan ke tipe "string" .to_i convert bilangan ke tipe "integer" Contoh: var=var.to_f

1.1.2 Operator Basic operator = set + tambah - kurang * kali / bagi % sisa contoh : 20%3 = 2 += var = var + nilai -= var = var - nilai *= var = var * nilai /= var = var / nilai %= var = var % nilai

 

Page 2: Ruby Rgss3

1‐2  

1.1.3 Conditional Flow Control if kondisi keluaran 1 else keluaran 2 end var = kondisi if var keluaran 1 else keluaran 2 end var = kondisi var ? puts("keluaran 1") : puts("keluaran 2") var = kondisi p "keluaran" if var RGSS <command> if <import script> unless command diatas digunakan bila kondisi tidak ter jadi (kebalikan if) dapat diganti dengan !if > Pembanding lebih besar dari < Pembanding lebih kecil dari >= Pembanding lebih besar atau sama dengan <= Pembanding lebih kecil atau sama dengan == Pembanding sama dengan. Inget, bukan pake ( = ) karena symbol itu buat ngeset nilai != Pembanding tidak sama dengan elseif command digunakan untuk penambahan kondisi && and

||

or

Page 3: Ruby Rgss3

1‐3  

multiple choice var = gets.to_i (pilih kondisi) case var when kondisi 1 keluaran 1 when kondisi 2 keluaran 2 else keluaran salah end rand mengeluarkan bilangan acak dari 0 s.d. 1

 

1.1.4 Sub program Def <sub program (argument)> <command> End <Sub program (argument)> Return Mengembalikan nilai di dalam sub program

Page 4: Ruby Rgss3

1‐4  

1.2 Ruby basic syntax by TheoAllen Disini w mau bahas soal basic2 pemrograman ruby. Karena gw yakin, yg ga ngerti script dari dasar dan mau coba-coba ngoprek RGSS di dalem RPG Maker pasti bakalan bingung. Langsung saja. Requirement:

Instal ruby. Caranya ada disini ~> http://ruby.about.com/od/beginningruby/ss/Installing-A-Ruby-Development-Environment-On-Windows.htm

Ngerti cmd / console (bagi yg g ngerti ane ntar terangin deh) Notepad++ Siap mental Ada lappie / kompie Willpower

Getting started: Nah, sekarang w anggap u dah nginstal rubynya dan punya Notepad++. Eit, jangan keburu dlu. Ini sekedar saran sih. bikin folder > namain "Ruby" > taruh di tempat yang paling enak dijangkau. Kalo saran gw sih “C:\Ruby” Itu ntar folder buat nyimpen file2 eksperimen ruby. Sekarang, kalian buka cmdnya. Lewat run > cmd (WinXP) ato search program > cmd (Win7) Langkah berikutnya, persiapin kaek gini:

Command "cd.." buat keluar dari directory / folder. Command "cd<spasi>namafolder" buat masuk subdirectory / folder Jangan diclose cmd-nya. Langkah selanjutnya, - buka notepad++ - Language > ruby (buat highlight syntax) Nah, persiapan beres. Kalian bisa mulai eksperimen ruby. Chapter one: Basic operations

1.2.1 Simple Syntax Tulis di notepad++ kaek gini puts 'hello' simpen pake nama terserah. kalo bisa sih dikasi nomer. mau dinomorin 001.rb jg boleh. Ntar bakal keluar kaek gini

Page 5: Ruby Rgss3

1‐5  

Well, simple enough. Things to know:

Tulisan yang berada dalem quote atau double quote itu disebut sebagai String keyword "puts" itu syntax buat ngeprint nilai/value

Let us advance to the next step

1.2.2 Getting and putting input Sekarang kita nyoba masukan nama dari input user. Kaek gini nih print('enter name ') name = gets() puts("Hello #{name}") Ntar bakal keluar kaek gini

Things to know:

Disini kan gw pake print ama puts. Bedanya, kalo print setelah dieksekusi, ngga ganti baris. Kalo puts, stelah dieksekusi, ganti baris

kata "name" adalah yang disebut namanya [b]variable.[/b] variable "name" itu ntar bisa dipake nyimpen suatu nilai (bisa berupa angka atau huruf). Di kasus contoh ini, variable "name" nyimpen masukan huruf dari user (angka jg bisa).

Double quote ama single quote itu beda. Single quote lebih ke ngeprint apa adanya, sedangkan double quote ngeprint nilai dari variable "name" dalam contoh itu. Coba aja puts bawah ndiri diganti [code]puts 'Hello #{name}'[/code]

Gets, buat nerima masukan dari user. Sbenernya () itu optional. Kalopun diilangin, ntar jalannya bakalan ttep sama. Cuman ntar di

kasus laen, kurung kaek gt berguna buat meminimalisir keambiguan script Nama variable di Ruby itu case sensitif. Variable dengan nama "myVar" dengan "myvar" sudah

merupakan hal yang berbeda banget. Line terakhir. #{nama_variable} itu semacem command buat ngeprint nilai dari variable dalam {}.

command2 laen juga ada. macem \n buat ganti baris. dan \t buat tab

Sebenernya #{} bukan cuman buat ngeprint nilai variable. tapi jg bisa digunain langsung kaek gini puts "1+2+3 = #{1+2+3}"

1.2.3 Numbers Sekarang ayok kita belajar berhitung attack = 100 defend = 50 damage = attack - defend puts "attack = #{attack} \ndefend = #{defend} \nthen damage = #{damage}" Outputnya ntar kaek gini

Page 6: Ruby Rgss3

1‐6  

Things to know:

Dalam scripting, sequence / urutan itu penting. kodenya g akan jalan kalo semisal u bikin kaek gini damage = attack - defend attack = 100 defend = 50 Karena dalam baris pertama, program ga ngerti apa itu "attack" dan "defend"

Beberapa basic operasi itung2ngan di ruby[list][*] (=) buat ngeset nilai o (+) Buat nambah nilai o (-) Buat ngurangin nilai o (*) Buat mengali nilai o (/) Buat ngebagi nilai o (%) Buat ngambil sisa bagi. Cnth : 20%3 ~> 2 (sisa bagi)

Sekarang coba bikin kode baru kaek gini attack = 100 p attack attack += 100 p attack attack -= 150 p attack Outputnya ntar kaek gini

Things to know:[list]

p << ini sbenernya buat nyimpelin "puts" Attack += 100 itu sama dengan kaek u bikin Attack = Attack + 100 Coba aja replace kalo g

percaya Attack = Attack + 100 itu semisal nilai "Attack" awalnya 100, operasinya yg berjalan ntar kaek gini

<Nilai attack yg baru> = <Nilai attack lama> + 100 Beberapa list operasi yang dapat dipake[list][*] (+=) Penambahan

o (-=) Pengurangan o (*=) Perkalian o (/=) Pembagian o (%=) Sisa bagi[/list][/list]

Page 7: Ruby Rgss3

1‐7  

Kode berikutnya damage = 100 damage = damage.to_f p damage damage = damage.to_s p damage damage = damage.to_i p damage Outputnya ntar kaek gini

Things to know:

(.to_f) itu convert bilangan ke tipe "float" dimana "float" itu macem pecahan gt (.to_s) buat convert ke tipe string / text (.to_i) buat convert ke tipe integer / bilangan bulat

1.2.4 Control flow : Conditional Branch Di RPG Maker, kalian pasti udah tau conditional branch. If <Kondisi benar> then <kondisi kalo benar> else <kalo salah>. Di Ruby juga ada beginian. Langsung aja, coba kode kaek gini attack = 100 defend = 50 if attack > defend p "damage delivered" else p "damage nullified" end Males aplod screenshot. Kalian tau kalo attack > defend nilainya bener. Maka script ntar akan ngeprint "damage delivered". kalo ngga, berarti "damage nullified" Nilai kebenaran attack > defend bisa disimpen dalam variable lain. Coba dibikin kodenya kaek gini. Ntar outputnya juga sama aja attack = 100 defend = 50 switch = attack > defend if switch p "damage delivered" else p "damage nullified" end Cara lain buat bikin kondisi bercabang, coba kaek gini attack = 100 defend = 50 switch = attack > defend

Page 8: Ruby Rgss3

1‐8  

switch ? puts("damage delivered") : puts("damage nullified") Yang ini strukturnya agak sesuatu well, formatnya gini <kondisi> ? <kalo benar> : <kalo salah> Ato juga cuman dibikin satu line. p "damage delivered" if switch # Formatnya | <lakukan sesuatu> if <kondisi disini benar> Yang kaek gini biasanya ditemui di script2 RGSS yang saling keterkaitan. Kyak add-on script gitu. Misalnya <command here> if <script anu diimport> Kalo keyword "if" itu buat eksekusi kondisi yang dinyatakan benar, sekarang kebalikannya yaitu "unless" attack = 100 defend = 150 switch = attack > defend unless switch p "damage nullified" else p "damage delivered" end[/code]ato[code]p "damage nullified" unless switch Kita jg bisa mbalik nilai kebenaran dari variable "Switch" dengan nambahin ( ! ) tepat didepan nama variable. Kaek gini attack = 100 defend = 150 switch = attack > defend if !switch p "damage nullified" else p "damage delivered" end Things to know:

( > ) Pembanding lebih besar dari (< ) Pembanding lebih kecil dari ( >= ) Pembanding lebih besar atau sama dengan (<= ) Pembanding lebih kecil atau sama dengan ( == ) Pembanding sama dengan. Inget, bukan pake ( = ) karena symbol itu buat ngeset nilai ( != ) Pembanding tidak sama dengan

1.2.5 Control flow : Advanced Conditional Branch Sekarang kita bikin input dari user print "input attack = " attack = gets.to_i

Page 9: Ruby Rgss3

1‐9  

print "input defend = " defend = gets.to_i if attack > defend p "damage delivered" elsif attack == defend p "damage nullified" else p "damage absorbed" end things to know :

gets.to_i itu buat convert input dari user ke bentuk integer. Karena fungsi gets sbenernya mbaca string. Jadi sbelum bisa dioperasikan ke bentuk angka, kudu diubah dlu.

elsif itu sbenernya bikin kondisi baru setelah else pertama.

Kode berikutnya. Masi sama kek atasnya. Cuman beda dikit print "input attack = " attack = gets.to_i print "input defend = " defend = gets.to_i if attack > defend && attack > 0 && defend > 0 p "damage delivered" elsif attack == defend && attack > 0 defend > 0 p "damage nullified" elsif attack < defend && attack > 0 && defend > 0 p "damage absorbed" else p "parameter must above 0" end Things to know :

(&&) itu artinya AND. Dimana AND itu jika dua kondisi yg menghubungkannya benar, maka nilainya benar. Buat testing di notepad, u bisa bikin kode simple kaek gini p (10 > 1 && 10 < 1) trus liat apa keluarannya

( || ) yang ini artinya OR. Dimana OR itu jika salah satu kondisi benar, maka semuanya benar. Coba kode diatas ganti gini p (10 > 1 || 10 < 1)

Sekarang kita coba macem pilihan print "input number (1-4) = " choice = gets.to_i case choice when 1 p "lu Maho" when 2 p "lu homo" when 3

Page 10: Ruby Rgss3

1‐10  

p "lu jelek" when 4 p "lu ganteng" else p "g ada di pilihan coy :v" end Things to know :

case itu ibaratnya kasus. when adalah kemungkinan-kemungkinan kasus else ibaratnya rencana terakhir kalo semua kondisi g masuk

Sekarang kita coba bikin sequence attack dan perhitungannya. Awas, persiapan mental. Yang disibi banyak banget kondisi2 yang perlu ditulis. Jadi siap2 mental ya? Sebelumnya, gw kasi satu fungsi di ruby dulu. Coba kode ini p rand * 10 rand itu fungsi ngegenerate bilangan random dari limit mendekati 0 ampe limit mendekati 1. kalo u mau bikin angka random dari 0 ampe 10, u kudu bikin rand * 11 Langsung ke codenya hit_chance = rand * 11 eva_chance = rand * 11 cri_chance = rand * 11 damage = 0 print "input attack = " attack = gets.to_i print "input defend = " defend = gets.to_i hit_rate = hit_chance < 7 eva_rate = eva_chance < 3 cri_rate = cri_chance < 1 success = hit_rate && !eva_rate if success damage = attack - defend if cri_rate damage * 3 p "critical! damage = #{damage}" else p "damage = #{damage}" end elsif !hit_rate p "attack missed" elsif eva_rate

Page 11: Ruby Rgss3

1‐11  

p "enemy evaded" end Output

Sequence script yg ngurus attack aja butuh panjang kaek gitu Well, things to know:

Wa disana pake bilangan random buat nentuin kemungkinan miss, evade, dan critical Variable "success" nilainya bener kalo attack masuk (hit_rate == true) dan musuh g evade

(eva_rate == false) Kalo sukses, kita itung lagi. Critical ngga? Kalo critical berarti damagenya dikali 3. Kalo ngga ya

biasa aja deh Kalo ngga sukses, masuk ke else if. Kalo serangan ga masuk, cetak miss Kalo masuk tapi musuh evade, berarti cetak evade

Udah ah, segini dulu. Cape bro nulisnya. Ntaran deh gw lanjut Reference: http://www.sapphiresteel.com/ruby-programming/The-Book-Of-Ruby

1.3 2nd Ruby Basic Syntax by TheoAllen

1.3.1 Methods Kalo scripting, seandainya kita bolak-balik nulis script yang sama, walo pake copas bakalan cape dan bikin program berantakan. Nah, setiap bahasa pemrograman, pastilah ada cara buat nyimpelin ginian. Istilahnya method :3 Langsung deh. Kalo di pemrograman ruby, kalian biasanya mesti nemuin hal macem ginian. Coba ditulis, trus dicoba pake notepad++ def test p ':v' end test Lagi males screenshot keluarannya :v Things to know:

def << untuk mengawali kalo itu adalah sebuah method def 'test' << 'test' adalah nama methodnya. Kalo di RGSS, misalnya ada def MakeDamageValue

buat perhitungan damage. 'test' di line terakhir itu buat pemanggilan method[/list]

Page 12: Ruby Rgss3

1‐12  

Contoh lain, bisa kaek gini Attack = 100 Defend = 50 def damage p Attack - Defend end damage method itu langsung ngitung damage dan langsung diprint out karena di akhir line, ada pemanggilan method 'damage'. Method juga bisa dibikin butuh "masukan" (istilah kerennya di bahasa pemrograman itu "argumen"). Misalnya kaek gini def damage(attack, defend) p attack - defend end damage(100,50) Di line terakhir, 100 kalo di dalem method itu dikenal sebagai "attack" Dan 50 dikenal sebagai "defend" Di dalam method ada yang namanya "Local variable". Dimana Local variable itu ga bisa diakses di luar method tanpa bantuan khusus. Contohnya kaek gini def damage(attack,defend) value = attack - defend end damage(100,50) p value # nilai "value" cuman bisa dikenali di method damage aja. Kalo mau ngeluarin caranya bisa gini def damage(attack, defend) value = attack - defend return value end p damage(100,50) Keyword / Syntax return disini artinya ngembaliin nilai yang dihasilin dari method itu. Yang kaek gini bisa dipake buat bantuan perhitungan. Kaek gini dmg = damage(100,50) p dmg Hasil print outnya bakal sama kaek yg atas. syntax return jg bisa dipake cara bercabang pake conditional branch. Misalnya def damage(attack,defend) return 0 if defend >= attack return attack - defend end

Page 13: Ruby Rgss3

1‐13  

Arti dari method diatas, kalo defendnya lebih ato sama dengan dari attack, maka balikin nilai 0. Bukan minus. Sbenernya di ruby ndiri, di akhir line itu udah dibaca sebagai return value. return ndiri sbenernya penegasan. U bikin method kaek gini pun jg bisa diprint out def mhp 1000 - 100 end p mhp Nilai masukan method jg bisa berasal dari method lain. Misalnya kaek gini. Siap2 buku matematika SMA. Karena gw mau ngasi contoh di pelajaran fungsi di SMA :lol2: def f(x) x*2/3 end def g(x) x*x end p f(g(10)) - g(10) itu sebagai nilai masukan dari f(x) - dan 10 adalah nilai masukan dari g(x) Sbenernya pelajaran SMA kaek gini g perlu repot2 dihitung. Cukup dibikin method, enter, keluar jawabannya. Kalo diminta caranya, kasi source codenya

1.3.2 Classes Ini gw sbenernya bingung cara neranginnya gimana Kalo kasarannya class itu macem type dari object. Kalo di RPG Maker ada yang namanya class enemy, class actor, class party, class window dll... Well, yu nyoba bikin class class Player def hp=(hp) @hp = hp end def hp @hp end end andy = Player.new andy.hp = 1000 p andy.hp Keluarannya ntar bakal ngeprint 1000

Page 14: Ruby Rgss3

1‐14  

Things to know:

nama class harus diawali huruf gede inget, class ndiri itu tipenya object. object punya kelakuan / behavior yang ntar bakal ditentuin

pake method2 @hp adalah variable class ato bahasa kerennya "Instance variable". Variable itu ngga akan

dikenali diluar. Artinya ga bisa diubah ato diambil tanpa nggunain method. def hp=(hp) << method ini gunanya buat ngeset nilai @hp def hp << method ini gunanya buat ngambil nilai @hp andy = Player.new << ini artinya, kita bikin Object "andy" dengan tipe "player" dimana player itu

mempunyai attribut Hit Point. andy.hp = 1000 << artinya kita ngeset, HP andy sebanyak 1000. method dalam kelasnya yg

dipanggil yaitu def hp=(hp). andy.hp (tanpa sama dengan) << artinya kita ngambil nilai HPnya andy. method dalam kelasnya

yg dipanggil yaitu def hp

Sbenernya hal diatas bisa kita simpelin pake attr_series. dimana attr_series itu macem gini:

attr_accessor :hp => replace def hp=(hp) ama def hp attr_reader :hp => replace def hp attr_writer :hp => replace def hp=(hp)

Coba class yg diatas diubah kaek gini. Ntar keluarannya jg pasti sama class Player attr_accessor :hp end class Player attr_reader :hp def hp=(hp) @hp = hp end end class Player attr_writer :hp def hp @hp end end Sementara ini dulu de. Masi banyak materi lainnya

Page 15: Ruby Rgss3

2‐1  

2 RMVXA

2.1 Understanding Workflow by Heartbreak61 Ehm, sebelum memulai, saya berasumsi bahwa agan2 yang baca ini sudah paham dasar-dasar ruby seperti method, module, class, hierarchy, instances, variables, comparable, dll, namun masih bingung tentang bagaimana workflow dari RMVX Ace. Tutorial ini mungkin kurang berguna bagi pengguna VX karena VX tidak menggunakan module-module tertentu seperti SceneManager dan BattleManager. Akan tetapi, tidak ada salahnya juga membaca tutorial ini karena secara garis besar, workflow VX dan VX Ace tidak jauh berbeda. Untuk sementara, tutorial ini hanya akan menjelaskan prosedur dari awal game dimulai sampai dengan Scene Title selesai diproses. Kembali ke topik, silakan buat new project, tekan F11, dan lihat di "Main" rgss_main { SceneManager.run} kode di atas adalah akar dari semua permasalahan dari engine RMVX Ace. Apabila line tersebut dihapus, maka semua masalah juga akan hilang (baca: no game at all) Awal dari semua (default) game Ace adalah menjalankan method "run" dari module SceneManager. Mari kita lihat sebagian isi dari module tersebut. module SceneManager @scene = nil @stack = [] @background_bitmap = nil def self.run DataManager.init Audio.setup_midi if use_midi? @scene = first_scene_class.new @scene.main while @scene end def self.first_scene_class $BTEST ? Scene_Battle : Scene_Title end ... end method run itu berfungsi untuk: - Menjalankan method init dari module Data_Manager <= intinya sih buat nge-load database dari folder Data - Menjalankan method setup_midi dari module Audio <= baca di help file - Mendeklarasikan variable @scene sebagai sebuah instance dari method first_scene_class - Menjalankan method main dari variable @scene method first_scene_class merupakan conditional. Jika $BTEST maka first_scene_class adalah Scene_Battle. Jika bukan, maka first_scene_class adalah Scene_Title $BTEST akan diset "true" secara otomatis saat kita menjalankan Battle Test dari tab Troop. Dengan asumsi yang kita jalankan adalah default play test (F12) maka secara garis besar dapat dikatakan bahwa: [code]@scene = Scene_Title.new

Page 16: Ruby Rgss3

2‐2  

@scene.main[/code] *)RMVX Ace menggunakan Array @stack untuk mengatur posisi hierarchy scene. Saat sebuah scene dipanggil menggunakan method call, maka current scene akan di push ke dalam array tersebut sehingga saat method return_scene di call dari scene yang baru dibuat, dia akan mengambil kembali scene terakhir dari @stack. (<< saya sendiri bingung gimana jelasinnya ya [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/727276.gif[/img]) Untuk lebih jelasnya pake perumpamaan aja deh [spoiler=Spoiler] Awal @scene = Scene_Map @stack = [] Nampilin Menu player pencet tombol Esc ==> SceneManager.call(Scene_Menu) @stack = [@scene] << @scene di sini adalah Scene_Map @scene = Scene_Menu.new Exit Menu player pencet tombol Esc ==> SceneManager.return @scene = @stack.pop << elemen terakhir dari @stack diambil dan mengakibatkan @stack jadi kosong Ada 2 tipe pemanggilan di SceneManager: method call => push @scene ke dalam @stack method goto => langsung bikin instance baru perbedaan mendasar dari kedua method ini adalah apabila sebuah scene dipanggil menggunakan goto, kemudian dilakukan SceneManager.return, maka game akan otomatis keluar karena @stack = [ ] mudah-mudahan cukup jelas tentang @stack ini [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/193560.gif[/img][/spoiler] Sekarang mari kita lihat di class Scene_Title, tekan ctrl + F dan ketik "def main". [i]whaddehel? kok ga ada method main di Scene_Title? [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img][/i] Tenang, jangan panik... Coba lihat dulu baik-baik [code]class Scene_Title < Scene_Base[/code] Nah, karena di Scene_Title tidak ada method main, maka coba kita lihat di Scene_Base [spoiler=Spoiler][code]class Scene_Base def main start post_start update until scene_changing? pre_terminate terminate end ... end[/code][/spoiler]

Page 17: Ruby Rgss3

2‐3  

Saya hanya akan menjelaskan secara garis besar apa yang dikerjakan oleh method main ini. - membuat @viewport dengan z=200. Dari hasil penerawangan sekilas, saya melihat bahwa viewport ini nantinya akan digunakan sebagai viewport untuk sebagian besar class Window seperti Window_Menu, Window_Message, dll. - melakukan transisi dari scene sebelumnya untuk 10 frame - meng-update Graphics, Input, dan Windows sampai scene tersebut selesai. Perlu diperhatikan bahwa method update perlu diperlakukan dengan hati-hati karena method ini merupakan sebuah loop yang hanya akan berakhir saat scene itu selesai. - meng-capture Graphics untuk dipergunakan sebagai transisi ke scene berikutnya, menghapus @viewport, menghapus semua window instance (saat scene selesai) OK, we're done with Scene_Base#main, so far... Kembali ke Scene_Title... [spoiler=Spoiler][code]class Scene_Title < Scene_Base def start super SceneManager.clear Graphics.freeze create_background create_foreground create_command_window play_title_music end[/code][/spoiler] Hal yang pertama dilakukan adalah super, berarti: - step pertama dari method ini mengacu kepada method start di Scene_Base, yaitu membuat sebuah Viewport dengan z = 200 - SceneManager.clear >> membuat @stack kosong (empty Array) - Graphics.freeze >> membuat sebuah screen capture untuk transisi - create_background >> membuat background (Gambar) - create_foreground >> membuat foreground (Titel game, kalo pilihan Draw Title di cek) - create_command_window >> membuat command window (yang isinya New Game, Continue, dan Shutdown) - play_title_music >> dan memutar musik Mengesampingkan create_background dan create_foreground yang lumayan mudah, mari kita membahas create_command_window [spoiler=Spoiler][code] def create_command_window @command_window = Window_TitleCommand.new @command_window.set_handler(:new_game, method(:command_new_game)) @command_window.set_handler(:continue, method(:command_continue)) @command_window.set_handler(:shutdown, method(:command_shutdown)) end[/code][/spoiler] hal yang pertama dilakukan oleh method ini adalah - men-declare @command_window sebagai sebuah instance baru dari class Window_TitleCommand - menghubungkan antara symbol2 yang ada dengan method tertentu mari berpaling sebentar ke Window_TitleCommand [spoiler=Spoiler][code]class Window_TitleCommand < WIndow_Command ... def make_command_list add_command(Vocab::new_game, :new_game) add_command(Vocab::continue, :continue, continue_enabled) add_command(Vocab::shutdown, :shutdown) end

Page 18: Ruby Rgss3

2‐4  

def continue_enabled DataManager.save_file_exists? end ... end[/code][/spoiler] Ini adalah salah satu perbedaan yang cukup menarik antara VX dan VX Ace. RMVX menggunakan index dari command window itu sendiri, sementara Ace menggunakan Array @list di mana setiap elemennya berisi hash dengan element [code]{:symbol, method(method_yang_akan_dipanggil), conditional, ext }[/code] Keterangan lebih lanjut liat Window_Command line 54 Mari kita cari cara gampangnya aja [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img], format untuk membuat sebuah command di window adalah: [b]*WARNING: bukan plug n play, cuma format aja loh ini[/b] [spoiler=Spoiler][code]class Your_Window_Name < Window_Command ... def make_command_list add_command("Your String", :your_symbol) <add another add_command method here> end ... end [/code][/spoiler] Sedangkan eksekusinya dilakukan dari class Scene_Base dan peranakannya [spoiler=Spoiler][code]class Your_Scene ... def create_command_window @your_window_name = Your_Window_Name.new #<= bisa diganti dengan class apa aja asalkan classnya Window_Command atau peranakannya. @your_window_name.set_handler(:your_symbol, method(:command_new_game)) <add another set_handler> end ... end [/code][/spoiler] perlu diperhatikan bahwa ":your_symbol" yang di set di Scene dan Window harus sama. Nah setelah kita tahu bahwa Scene_Title memiliki perintah untuk membuat sebuah Window_TitleCommand dengan 3 link antara symbol dan method di dalamnya, sekarang mari kita lihat command2 yang berhubungan dengan symbol tadi. back to Scene_Title... [spoiler=Spoiler][code] ... def command_new_game DataManager.setup_new_game close_command_window

Page 19: Ruby Rgss3

2‐5  

fadeout_all $game_map.autoplay SceneManager.goto(Scene_Map) end def command_continue close_command_window SceneManager.call(Scene_Load) end def command_shutdown close_command_window fadeout_all SceneManager.exit end ...[/code][/spoiler] saat :new_game dipilih, method command_new_game akan dijalankan. saat :continue dipilih, method command_continue akan dijalankan. saat :shutdown dipilih, method command_shutdown yang akan dijalankan. Sementara cukup sekian dulu dari saya, semoga tulisan ini sedikit banyak bisa memberi inspirasi bagi RMID-er. Bagi yang belum tahu, agar bertambah ilmunya, bagi yang sudah tahu agar tetap ingat ilmunya [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/962428.png[/img] Mohon koreksi, kritik, atau sarannya [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/193560.gif[/img] Nambah as requested by TheoAllen [b]Penggunaan Alias[/b] Alias adalah salah satu cara untuk menambahkan line pada suatu method dengan aman. Langsung contoh ya, coba liat di Game_Actor. Mari kita coba menambahkan instance variable age. Secara default, line nya berbunyi begini [spoiler=Spoiler][code]class Game_Actor < Game_Battler ... def initialize(actor_id) super() setup(actor_id) @last_skill = Game_BaseItem.new end def setup(actor_id) @actor_id = actor_id @name = actor.name @nickname = actor.nickname init_graphics @class_id = actor.class_id @level = actor.initial_level @exp = {} @equips = [] init_exp init_skills

Page 20: Ruby Rgss3

2‐6  

init_equips(actor.equips) clear_param_plus recover_all end ... end[/code][/spoiler] Instance variable biasanya di declare pada saat initialization, namun karena struktur Game_Actor menambahkan semua instance variablenya di method setup, mari kita ikuti struktur default ace aja ya... Coba buat line script baru di bawah material [spoiler=Spoiler][code]class Game_Actor alias new_setup setup def setup new_setup @age = 0 end end[/code][/spoiler] Bagaimana maksud script di atas? Well secara gampangannya sih, [code]alias new_setup setup[/code] line ini melakukan "rename sementara" terhadap method setup. Namanya diganti jadi new_setup [code]def setup new_setup @age = 20 end[/code] nah di tahap ini, dia menjalankan method "new_setup" yang tadi sudah kita rename dahulu, kemudian menambahkan instance @age = 20 Jadi secara keseluruhan system akan membaca seperti ini: [spoiler=Spoiler][code]def setup @actor_id = actor_id @name = actor.name @nickname = actor.nickname init_graphics @class_id = actor.class_id @level = actor.initial_level @exp = {} @equips = [] init_exp init_skills init_equips(actor.equips) clear_param_plus recover_all @age = 20 end[/code][/spoiler] *Perhatikan bahwa @age = 20 ditambahkan pada line setelah new_setup selesai. [i]Q= Lah bedanya sama menulis method setup dari awal apaan?[/i] A= Beda... Bedanya... ummmm pake contoh lagi ya [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img] Coba buat line baru di bawah penambahan age tadi. Sekarang

Page 21: Ruby Rgss3

2‐7  

kita coba menambah gender pada actor. contoh 1 [spoiler=Spoiler][code]class Game_Actor alias new_setup2 setup def setup new_setup2 @Gender: "Female" end end[/code][/spoiler] contoh 2 [spoiler=Spoiler][code]class Game_Actor def setup @actor_id = actor_id @name = actor.name @nickname = actor.nickname init_graphics @class_id = actor.class_id @level = actor.initial_level @exp = {} @equips = [] init_exp init_skills init_equips(actor.equips) clear_param_plus recover_all @gender = "Female" end end[/code][/spoiler] Contoh 1: dia aliasing method setup menjadi new_setup2. Nah, semua method setup yang sudah dilakukan sebelum line ini ditambahkan akan di-run terlebih dahulu, termasuk saat kita menambahkan @age tadi. Contoh 2: dia langsung overwrite method setup, di sini @age yang tadi kita tambahkan tidak dijalankan karena line ini me-rewrite semua method setup. Pada praktiknya, pasti kita banyak memakai script add-on. Dan akan terlalu lama untuk meneliti method mana saja yang sudah dialias. Untuk menghindari script -script terlewati seperti contoh 2 tadi, ada baiknya kita selalu melakukan aliasing (sebisa mungkin) untuk menambah compatibility dengan script yang lain. Kira-kira segitu saja tambahannya, mudah2an ngerti [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/193560.gif[/img]

2.2 Understanding Workflow Part II: DataManager & Notetagging by Heartbreak61 Di awal sudah kita bahas mengenai SceneManager.run. Nah salah satu isi dari SceneManager.run itu adalah DataManager.init. Mari sekarang kita coba bahas DataManager [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/3684740496.gif[/img] [spoiler=Spoiler][code] def self.init

Page 22: Ruby Rgss3

2‐8  

@last_savefile_index = 0 load_database create_game_objects setup_battle_test if $BTEST end [/code][/spoiler] [quote]- Melakukan deklarasi nilai awal @last_savefile_index yang nantinya akan disesuaikan sesuai dengan posisi index save slot terakhir. - Mengeset beberapa global variable menjadi value dari load_file .rvdata2 yang di save dari editor - Membuat instance beberapa dari Game_ class - Melakukan persiapan battle_test apabila game dipanggil dari tab Troop >> Battle Test[/quote] Dari keempat line di atas, yang cukup menarik adalah load_database karena sering digunakan untuk melakukan notetagging. Sedangkan create_game_objects bisa dimanfaatkan juga apabila kita ingin membuat suatu instance dari class yang kita buat sendiri. (Misal kita membuat class Game_Time). Walaupun sebenarnya instance bisa di diclare di mana saja, tetapi kalo di declare di sini kan ada temen-temennya (ga penting banget [img] http://r17.imgfast.net/users/1712/29/57/59/smiles/2639678693.png[/img]). [size=150][b]About Database[/b][/size] Ketika pertama mengenal RPG Maker, saya sempat bingung apakah perbedaan antara RPG::Actor dengan Game_Actor, kapan masing-masing class tersebut di- initialize, dan apakah hubungan antara dua class yang identik tersebut. Nah, sekarang saya mencoba berbagi hal-hal yang telah saya pelajari selama ini agar teman-teman tidak perlu mengalami kebingungan seperti saya. Database yang kita edit di Editor RM akan disimpan dalam bentuk file *.rvdata2 (VX Ace). Sedangkan strukturnya dapat dilihat di Help File >> RGSS Reference Manual >> Game Library >> RPGVXAce Data Structures. Setiap class RPG::* memiliki instance variables yang sama persis dengan value yang bisa diedit di Editor. Mari kita coba ambil contoh dari map yang kita edit menggunakan Editor. Pada dasarnya, semua data yang kita buat akan ditampung dalam 3 class untuk memudahkan pengorganisasian yaitu RPG::Map, RPG::Map::Encounter, dan RPG::MapInfo. [spoiler=Spoiler][code] class RPG::Map def initialize(width, height) @display_name = '' @tileset_id = 1 @width = width @height = height @scroll_type = 0 @specify_battleback = false @battleback_floor_name = '' @battleback_wall_name = '' @autoplay_bgm = false

Page 23: Ruby Rgss3

2‐9  

@bgm = RPG::BGM.new @autoplay_bgs = false @bgs = RPG::BGS.new('', 80) @disable_dashing = false @encounter_list = [] @encounter_step = 30 @parallax_name = '' @parallax_loop_x = false @parallax_loop_y = false @parallax_sx = 0 @parallax_sy = 0 @parallax_show = false @note = '' @data = Table.new(width, height, 4) @events = {} end attr_accessor :display_name attr_accessor :tileset_id attr_accessor :width attr_accessor :height attr_accessor :scroll_type attr_accessor :specify_battleback attr_accessor :battleback1_name attr_accessor :battleback2_name attr_accessor :autoplay_bgm attr_accessor :bgm attr_accessor :autoplay_bgs attr_accessor :bgs attr_accessor :disable_dashing attr_accessor :encounter_list attr_accessor :encounter_step attr_accessor :parallax_name attr_accessor :parallax_loop_x attr_accessor :parallax_loop_y attr_accessor :parallax_sx attr_accessor :parallax_sy attr_accessor :parallax_show attr_accessor :note attr_accessor :data attr_accessor :events end class RPG::Map::Encounter def initialize @troop_id = 1 @weight = 10 @region_set = [] end attr_accessor :troop_id attr_accessor :weight attr_accessor :region_set end class RPG::MapInfo def initialize @name = ''

Page 24: Ruby Rgss3

2‐10  

@parent_id = 0 @order = 0 @expanded = false @scroll_x = 0 @scroll_y = 0 end attr_accessor :name attr_accessor :parent_id attr_accessor :order attr_accessor :expanded attr_accessor :scroll_x attr_accessor :scroll_y end [/code][/spoiler] Sekarang mari kita coba bandingkan struktur di atas dengan gambar ini. [spoiler=Spoiler] [img]https://dl.dropbox.com/u/75708618/tutorial_workflow_2a.jpg[/img] [/spoiler] Terlihat bahwa semua data Map yang bisa diedit di Editor ditampung dalam instance variable dari class RPG::Map, RPG::Map::Encounter, dan RPG::MapInfo. Hal tersebut berlaku juga untuk Actor, Class, Weapon, Item, System, dsb. Kemudian semua instance yang ada tersebut disimpan dalam sebuah file yang berekstensi *.rvdata2. Jadi misalnya kita membuat 10 actor, maka dalam file Actors.rvdata2 akan terdapat 10 instance dari class RPG::Actor. Mari kita kembali melihat ke DataManager#load_normal_database. [spoiler=Spoiler][code] def self.load_normal_database $data_actors = load_data("Data/Actors.rvdata2") $data_classes = load_data("Data/Classes.rvdata2") $data_skills = load_data("Data/Skills.rvdata2") $data_items = load_data("Data/Items.rvdata2") $data_weapons = load_data("Data/Weapons.rvdata2") $data_armors = load_data("Data/Armors.rvdata2") $data_enemies = load_data("Data/Enemies.rvdata2") $data_troops = load_data("Data/Troops.rvdata2") $data_states = load_data("Data/States.rvdata2") $data_animations = load_data("Data/Animations.rvdata2") $data_tilesets = load_data("Data/Tilesets.rvdata2") $data_common_events = load_data("Data/CommonEvents.rvdata2") $data_system = load_data("Data/System.rvdata2") $data_mapinfos = load_data("Data/MapInfos.rvdata2") end [/code][/spoiler] Dapat kita lihat bahwa global $data_* hanya merupakan wrapper dari semua class RPG::* yang sudah disimpan dalam file *.rvdata2. Hal ini dilakukan untuk memudahkan reference saat Ace melakukan inisialisasi class Game. Berikut adalah contoh proses reference dari $data_actors ke class Game_Actor [spoiler=Spoiler][code]class Game_Actor < Game_Battler ... def actor

Page 25: Ruby Rgss3

2‐11  

$data_actors[@actor_id] end ... end[/code][/spoiler] Di sini, method actor merujuk pada $data_actors[@actor_id]. Sehingga dapat dikatakan bahwa actor itu adalah data yang terdapat pada Actors.rvdata2 dengan indeks @actor_id. Kesimpulannya, secara garis besar proses dari kita mengedit data di Editor sampai dipergunakan di dalam game secara garis besar adalah sebagai berikut. [spoiler=Spoiler][img]https://dl.dropbox.com/u/75708618/tutorial_workflow_2b.jpg[/img][/spoiler] *penting ya? [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img] [size=150][b]Bonus: Notetagging[/b][/size] Notetagging biasanya diartikan dengan melakukan match data dari Note di database kemudian (biasanya) melakukan deklarasi instance variable dari class RPG dan peranakannya. Contoh dari notetagging yang sederhana adalah menambahkan instance variable age dan gender pada class Game_Actor. Berikut ini adalah salah satu cara untuk melakukan notetagging [spoiler=Spoiler][code] #pertama-tama kita membuat module/global variables untuk menyimpan regex. Sebenarnya fungsi module/global di sini hanya untuk memudahkan scanning di nantinya. Mari kita menggunakan module saja (seperti yang banyak digunakan para scripter pro :P) module Regex Age = /<age: (d+)>/i Gender = /<gender: (w+)>/i end #kemudian kita menambahkan method call di akhir DataManager#Load_Database dengan cara aliasing module DataManager #setau saya cara aliasing di module itu kaya gini. kalo yang tahu model lain, mohon dishare class <<self alias my_custom_load_database load_database end def self.load_database my_custom_load_database my_custom_scan_notes end def self.my_custom_scan_notes for actor in $data_actors next if actor.nil? # mencegah annoying "No Method Error" actor.scan_note # method scan_note di RPG::Actor akan kita tulis di bawah end end end #DataManager [/code][/spoiler] *Saya biasanya memberikan comment untuk setiap class end untuk menghindari syntax error akibat kekurangan/kelebihan end.

Page 26: Ruby Rgss3

2‐12  

Setelah memerintahkan Ace untuk melakukan method scan note untuk class RPG::* yang diinginkan, kita perlu melakukan deklarasi di class RPG::* tersebut agar tidak muncul no-method error. [spoiler=Spoiler][code] class RPG::Actor < RPG::BaseItem #di sini kita menambah deklarasi instance variable @age dan @gender alias my_custom_initialize initialize def initialize my_custom_initialize @age = 0 @gender = "None" end def scan_note # <= hati-hati! ada kemungkinan nama method ini dipakai orang lain. disarankan untuk menggunakan nama method yang unik. self.note.split(/[\r\n]+/).each {|line| # <= memisah2kan line berdasarkan end line \n atau \r. case line when Regex::Age @age = $1.to_i when Regex::Gender @gender = $1.to_s.upcase end } end # berikan attr_accessor / attr_reader agar instance var dapat dibaca dari luar class attr_accessor :age attr_accessor :gender end #RPG::Actor [/code][/spoiler] Setelah selesai melakukan editing di RPG::Actor, mari kita mengedit class yang akan benar-benar dipakai di game. Ingat bahwa RPG::Actor itu hanya merupakan database yang nantinya akan menjadi referensi pada saat inisialisasi Game_Actor. [spoiler=Spoiler][code] class Game_Actor < Game_Battler alias my_custom_setup setup #baca post pertama kenapa saya aliasing di setup def setup(actor_id) my_custom_setup(actor_id) @age = actor.age @gender = actor.gender end attr_accessor :age attr_accessor :gender end #Game_Actor [/code][/spoiler] nah dengan model seperti di atas, apabila kita menambahkan <age: value> dan <gender: value> di actor's note, data tersebut akan di load melalui DataManager dan digunakan di Game_Actor class.

Page 27: Ruby Rgss3

2‐13  

apabila di tengah-tengah game kita memutuskan untuk menggunakan gender atau age sebagai referensi, maka kita tinggal memanggil method tersebut, misalnya [code]$game_actors[1].age < 20 ? p "Young" : p "Old"[/code] [b]segitu dulu, penjelasan mendetailnya masih dipikir kata-katanya [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img][/b] [color=red]PS: post under construction[/color][/quote]

2.3 Advanced Skill's Custom Formula by Heartbreak61 KATA PENGANTAR Sebenernya tutorial ini sebagian hanya merupakan terjemahan dari tutorial Fomar0153 yang ternyata saya rasakan sangat berguna untuk diterapkan. Mungkin banyak member yang sudah tahu masalah penggunaan damage formula ini. Akan tetapi tutorial ini memang ditujukan kepada para New RMer. [size=133][align=center]PART I[/align][/size] Langsung ke pokok masalah, coba agan buka tab Skill Attack lalu lihat di formulanya. Nah di situ kan ada tulisan: [code]a.atk * 4 - b.def * 2[/code] Kali ini saya akan mencoba share knowledge tentang bagaimana menyiasati damage formula ini agar lebih bervariasi. Sebelum masuk ke materi, ada baiknya kita mengetahui salah satu cara membuat conditional if then else end dalam satu line. [code]if a == 10 puts "true" else puts "false" end[/code] Line di atas dapat disingkat menjadi: [code]if a == 10;puts "true"; else; puts "false"; end[/code] Tanda titik koma menunjukkan end of line atau [code]a == 10 ? puts "true" : puts "false"[/code] nah, jadi formatnya [code]condition <spasi>?<spasi> true <spasi>: <spasi> false[/code] Erik punya skill Slime Destroyer. Kalo dihit ke Slime maka damage Erik ATK * 100, selain itu hanya 50. maka situasi di atas dapat ditulis di kolom formula menjadi [code]b.id == 1 ? a.atk * 100 : 50[/code] Dari contoh di atas, ternyata monster ID 2 dan 3 juga merupakan marga Slime: [code](b.id==1 || b.id == 2 || b.id == 3) ? a.atk * 100 : 50[/code] *note: tanda || sama artinya dengan "or" Skill Gravity memiliki damage 1/2 current HP [code]b.hp/2[/code] Erik punya skill di mana dia meminjam kekuatan serang Terrance * 5

Page 28: Ruby Rgss3

2‐14  

[code]$game_actors[3].atk * 5[/code] Damage serangan = a.atk * 8 jika kondisi switch 1 on. Kalo switch 1 off damage a.atk * 20 [code]$game_switches[1] ? a.atk * 8 : a.atk * 20[/code] *Note: dapat dilihat di sini bahwa switch itu sebuah boolean. Kalo on berarti true, kalo off berarti false. Damage serangan = Variable nomer 1 * a.atk [code]$game_variables[1] * a.atk[/code] Diingetin sama Rian01 [code]v[1] * a.atk[/code] Ada gambler yang melempar 2 dadu. Kalo 2 dadu nilainya 6 maka damagenya 10.000 Kalo angkanya sama damagenya 1000, kalo ga ada yang sama, nilainya jumlah angka di kedua dadu tersebut * 10 [code]c=rand(6);d=rand(6);if c==6&&d==6;10000;elsif c==d;1000;else;(c+d)*10;end[/code] *di sini saya tidak memberikan spasi biar lebih irit tempat *variable a dan b sudah di "book" sama system, jadi untuk membuat local variable lain, gunakan huruf alfabet yang lain. Ada skill yang menyebabkan musuh dan caster keracunan (misal poison itu state ID 4) [code]a.add_state(4);b.add_state(4);a.atk*4-b.def*2[/code] Damage weapon bertambah saat mengenakan weapon tertentu [code]a.weapons.include?($data_weapon[1]) ? a.atk * 1000 : a.atk * 100[/code] Apabila skill ini digunakan oleh Eric dan Natalie ada di party, damage 1000. Kalo yang menggunakan orang lain cuma 100 [code]a==$game_actors[1]&&$game_party.members.include?($game_actors[2]) ? 1000 : 100[/code] [i]yang di atas emang agak advance[/i] Nambah Dengan asumsi belum tau penggunaan max sama min di array, model begini bisa jadi pilihan Limit damage minimal 1 [code][a.atk * 4 - b.def * 2, 1].max[/code] Limit damage max 200 [code][a.atk * 4 - b.def * 2, 200].min[/code] [align=center]== *** ==[/align] [size=133][align=center]PART II[/align][/size] Berhubung saat ini sedang hujan lebat sehingga saya ada alasan untuk telat ngantor, maka saya memutuskan untuk melanjutkan curhat tentang custom formula ini. [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img] Sebelum memulai inti curhat, ada baiknya bagi yang belum tahu tentang struktur RGSS3, untuk melihat gambar yang berikut ini: [img]http://img841.imageshack.us/img841/9633/hierarchy.jpg[/img] Gambar di atas adalah silsilah keluarga dari actor dan enemy (ternyata kedua musuh bebuyutan itu eyangnya sama ya? [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img]) Jadi, apakah fungsi dari mengetahui hierarchy? Saya coba langsung menjelaskan lewat contoh:

Page 29: Ruby Rgss3

2‐15  

class Game_Battler adalah "parent" class (ada juga yang menyebut superclass) dari Game_Battler. Artinya, semua method2 (kalo di script tulisannya def xxx) di Game_BattlerBase dimiliki juga oleh child classnya yaitu Game_Battler. Nah berhubung Game_Actor dan Game_Enemy memiliki parent Game_Battler, berarti baik Game_Actor maupun Game_Enemy memiliki semua method2 dari Game_BattlerBase dan Game_Battler. OK, langsung contoh. Coba lihat di formula bar: [code]a.atk * 4 - b.def *2[/code] *di sini a dan b adalah "caster" dan "target" dari suatu skill yang memiliki class "Game_Actor" ataupun "Game_Enemy" Coba sekarang silakan anda cari di Game_Actor maupun Game_Enemy line yang berbunyi [b]def atk[/b]. Tidak ada bukan? Sekarang coba cari [b]def atk[/b] di Game_BattlerBase. nanti akan ketemu line yang berbunyi. [code]def atk; param(2); end[/code] [quote]Lah, methodnya ada di Game_BattlerBase kok bisa dipanggil dari Game_Actor/Game_Enemy?[/quote] Ingat! Children class mewarisi semua method dari Parentnya. Berhubung Game_BattlerBase adalah "kakek" [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img] dari Actor dan Enemy, makanya method [b]atk[/b] yang di declare di Game_BattlerBase bisa dipanggil dari Actor maupun Enemy. [quote]OK, ane dah paham. Trus gunanya buat apa?[/quote] Sabar bung, coba sekarang tulis ini di bawah Material dan di atas main [code]class Game_Battler < Game_BattlerBase def my_skill(a,b) return 20 if a.is_a?(Game_Actor) return 10 if a.is_a?(Game_Enemy) end end[/code] Lalu coba buat skill dengan nama "My Skill" yang formulanya berisi [code]a.my_skill(a,b)[/code] Karena method tersebut dibuat di Game_Battler, maka Skill tersebut bisa dipanggil oleh Actor maupun Enemy. Sekarang coba di test di game. Buat enemy yang action listnya hanya menggunakan My Skill, masukkan formula [code]a.my_skill(a,b)[/code] Dan lakukan batle test (jangan lupa di save dulu [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/202119.gif[/img] ) Nanti akan terlihat ketika Actor menggunakan "My Skill", dia akan menimbulkan damage 20. Sedangkan saat Enemy menggunakannya, hanya akan menimbulkan damage 10. Apabila tadi anda buat method my_skill di Game_Actor, maka saat Enemy menggunakan skill tersebut akan muncul "No-Method Error" karena memang tidak ada method my_skill di Game_Enemy. Mari kita coba melihat skil lempar 2 dadu di part 1 dan mengubahnya sedikit. - Seorang gambler melempar 2 dadu.

Page 30: Ruby Rgss3

2‐16  

- Jika kembar 6, maka damage = 100 * a.atk - b.def - Jika kembar selain 6, maka damage = 20 * a.atk -b.def - Kalo ga ada yang kembar, maka damage = (jumlah dadu) * atk - def [code]class Game_Battler < Game_BattlerBase def lempar_dadu(a,b) c = rand(6) d = rand(6) if c == 6 && d == 6 return 100 * a.atk - b.def elsif c == d return 20 * a.atk - b.def else return (c+d) * a.atk end end[/code] Dengan begini jauh lebih mudah dibaca daripada formula satu line di Skill Editor standard. [quote]Udah? cuma bikin simpel doang nih maksudnya?[/quote] Dengerin dulu kenapa sih [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/4021420466.png[/img] Ehm, salah satu dari kegunaan yang paling "handy" dari membuat method di Game_Battler/Game_BattlerBase adalah membuat sebuah template di mana ketika kita akan balancing, kita hanya perlu sedikit mengedit di bagian script dan semua skill yang berhubungan dengan method tersebut akan ikut berubah damagenya. contoh - Saya punya 4 skill, Sword Heavy Attack, Spear Heavy Attack, Axe Heavy attack, dan Magic Bolt. - Sword HA, Spear HA, dan Axe HA skill itu punya formula a.atk * 8 - b.def * 2 - Sedangkan Magic Bolt punya formula a.mat * 6 - b.mdf * 2 - Setelah beberapa kali test play, anda berpikir bahwa formulanya perlu diubah jadi a.atk * 30 - b.def * 2 dan a.mat * 20 - b.mdf * 2 - Itu berarti anda harus mengubah 4 (EMPAT) skill formula secara manual. - Iya kalo cuma 4, kalo ada 500 skill dengan formula yang sama? (kalo ane mah mending bikin project baru [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/2639678693.png[/img]) sekarang coba tulis ini di script [code]class Game_Battler < Game_BattlerBase def my_skill_tier1(a,b,magical=false) return a.mat * 6 - b.mdf * 2 if magical return a.atk * 8 - b.def * 2 end end[/code] Terus masukkan formula [code]a.my_skill_tier1(a,b)[/code] buat Sword Strong Attack, Spear Heavy Attack, Axe Heavy Attack, dan Magic Bolt Dengan begitu, saat anda ingin melakukan perubahan formula, yang perlu anda lakukan hanyalah mengubah isi method my_skill_tier1 dan VIOLA! secara ajaib ketiga damage Skill tersebut berubah dengan sendirinya [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/863250.gif[/img] [align=center]== *** == [b][size=150]PENUTUP[/size][/b][/align]

Page 31: Ruby Rgss3

3‐17  

buset panjang bener ternyata - Puji syukur saya panjatkan kehadirat Tuhan YME atas segala limpahan rahmat dan hidayah-Nya sehingga saya mempunyai niat untuk menulis tutorial yang panjang ini. - Mama dan Papa yang telah melahirkan dan membesarkan anak ganteng seperti saya. - Ibu kos dan bapak kos yang telah memberikan naungan bagi anak rantau seperti saya. - Seluruh RMID members (terutama member-member yang kembali memunculkan niat saya bikin eroge [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img]) Basic saya bukanlah seorang programmer, jadi apabila ada kesalahan tulis atau istilah dalam programming, sudilah kiranya saudara maafkan dan doakan saya semoga kesalahan2 saya diampuni [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/925440398.png[/img] Kiranya cukup sekian tutorial dari saya. Insya Alloh dilanjut (kalo niat) Semoga membantu [img]http://r17.imgfast.net/users/1712/29/57/59/smiles/863250.gif[/img] [align=center][size=150][b]SPECIAL CREDIT [/b][/size][/align] Fomar0153 for his amazing tutorial [align=center][size=150][b]DAFTAR PUSTAKA[/b][/size][/align] [url=http://cobbtocs.co.uk/wp/?p=286]http://cobbtocs.co.uk/wp/?p=286[/url] [url=http://cobbtocs.co.uk/wp/?p=271]http://cobbtocs.co.uk/wp/?p=271[/url] *PS: Di situs om fomar sendiri sebenarnya ada tutorial tentang hierarchy windows. Namun saya belum berani menerjemahkan karena saya sendiri masih mempelajari class Window & Scene. Bagi scripter yang lain, mungkin ada baiknya menerjemahkan tutorial tentang Windows Hierarchy tersebut ke bahasa Indonesia di forum ini.[/quote]

3 Sumber

http://rpgmakerid.s4f4e.com/viewtopic.php?f=4&p=114612 

http://rpgmakerid.s4f4e.com/viewtopic.php?f=54&p=114965#p114965 

http://rpgmakerid.s4f4e.com/viewtopic.php?f=46&p=113417 

http://rpgmakerid.s4f4e.com/viewtopic.php?f=4&t=7483