1. Wchodzimy w Edytor skryptów i w lewym pasku wyszukujemy Scene_Menu. Zaimplementowana tam klasa odwołuje się do Menu - tylko do pierwszego okna, które pojawia się po wciśnięciu ESC na mapie.
2. Wyszukujemy definicję (linijka 18)
Definicja odpowiada za najważniejsze procesy w klasie. Co jest jednak dla nas najważniejsze, znajdują się tu poszczególne zmienne: s1, s2, s3, s4 itd.
Kod: |
s1 = $data_system.words.item
s2 = $data_system.words.skill
s3 = $data_system.words.equip
s4 = "Status"
s5 = "Save"
s6 = "End Game" |
Przyglądając się tym zmiennym łatwo zauważyć, że niektórym przyporządkowano jakieś zmienne globalne (te rozpoczynające się znakiem $) oraz zwykłe słowa zamknięte w cudzysłów ("Status").
Ale skoro chcemy dodać swoją opcję w menu, to dodajemy na koniec nową zmienną, np. 's7' i odpowiednio ją nazywamy:
Kod: |
s1 = $data_system.words.item
s2 = $data_system.words.skill
s3 = $data_system.words.equip
s4 = "Status"
s5 = "Save"
s6 = "End Game"
s7 = "Nowa komenda" |
3. W tej samej definicji, tuż pod zmiennymi znajduje się linijka, która tworzy okno (odwołuje się do zaimplementowanej już klasy - Window_Command)
Kod: |
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6]) |
160 - to szerokość okna poleceń (można ją dowolnie zmieniać)
[s1, s2, s3, s4, s5, s6] - to tablica, na której elementy składają się modyfikowane przez nas zmienne. Jak widać zmiennych jest o jedną za mało. Należy wpisać, po przecinku, dodaną wcześniej zmienną s7:
Kod: |
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7]) |
4. W porządku. Mamy tyle poleceń, o ile nam chodziło. Gdy uruchomimy grę, zobaczymy jednak, że po wybraniu komendy nic się nie dzieje. Koniecznie musimy to naprawić.
Wyszukujemy zatem definicji (linijka 106):
W tej definicji znajduje się informacje, co się dzieje, gdy będąc w menu wciśniemy Enter (Input::C) lub ESC (Input::B).
Nas interesuje tylko ten fragment:
Kod: |
case @command_window.index
when 0 # item
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to item screen
$scene = Scene_Item.new
when 1 # skill
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 2 # equipment
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 3 # status
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 4 # save
# If saving is forbidden
if $game_system.save_disabled
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to save screen
$scene = Scene_Save.new
when 5 # end game
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to end game screen
$scene = Scene_End.new
end
|
Kod ten można mniej więcej przetłumaczyć następująco: "w zależności od tego (case), jaki jest indeks okna poleceń (@command_window.index) to rób to i to". Indeks odpowiada kolejno :
s1 = indeks 0
s2 = indeks 1
s3 = indeks 2
Czyli pierwsza komenda w oknie zawsze będzie miała indeks 0.
W naszym przypadku indeks 0 ma polecenie Item / Przedmiot.
Domyślnie zatem nasza nowa komenda (skoro jest siódma na liście) ma indeks 6. Zatem przyjrzyjmy się linijce:
Kod: |
when 5 # end game
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to end game screen
$scene = Scene_End.new |
W naszej nowej liście brakuje indeksu 6, zatem pod powyższym fragmentem dodajemy linijkę:
Kod: |
when 6 # nowa komenda |
To jednak nie wszystko. Nie wpisaliśmy, co ma się stać w chwili wybrania tego polecenia. Zgodnie ze wzorem powyżej powinniśmy wpisać:
Kod: |
$game_system.se_play($data_system.decision_se) |
co powoduje, że z chwilą wyboru odegra się muzyczka, oraz komendę, która przekieruje nas do następnej sceny:
NAZWA powinna odpowiadać nazwą nowej sceny, najczęściej polecenie to podane je wraz z nowym skryptem, np.
Kod: |
$scene = MonsterBook.new
$scene = Dziennik.new |
5. Testując naszą grę możemy zaobserwować, że nowa komenda nie mieści się w oknie. Najlepszym wyjściem za tej sytuacji jest wprowadzenie możliwości przewijania poleceń w oknie Menu. Aby to zrobić nad Main należy wkleić poniższy skrypcik:
Kod: |
class Window_Command < Window_Selectable
def initialize(width, commands, height = commands.size * 32 + 32)
super(0, 0, width, height)
@item_max = commands.size
@commands = commands
self.contents = Bitmap.new(width - 32, @item_max * 32)
refresh
self.index = 0
end
end |
Wrócić do Scene_Menu, do naszej modyfikowanej wcześniej linijki z:
Kod: |
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7]) |
i po tablicy z poleceniami dodać po przecinku liczbę 224, co daje:
Kod: |
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7], 224) |
Tym samym nasze okno w menu będzie wyglądało podobnie do tego:
Oczywiście można zamiast skryptu usunąć jakieś domyślne polecenie na rzecz nowego. Można także zmniejszyć lub usunąć okna z Liczbą kroków, czasem lub złotem.