Pomogła: 232 razy Dołączyła: 18 Wrz 2007 Posty: 2424
Wysłany: Sro 13 Lip, 2011 17:53
Nowa komenda w menu?
Witam Przedstawiam Wam krótki tutorial pokazujący, jak dodać nową komendę w menu.
Oczywiście tutorial odwołuje się do domyślnej klasy Scene_Menu, która może być modyfikowana przez inne używane przez Was skrypty. Dlatego w przypadku, gdy wprowadzone przez Was modyfikacje nie działają, oznacza to, że należy wyszukać w dodatkowych skryptach również odwołań do klasy Scene_Menu.
Uwaga!
Spoiler:
Zanim przystąpimy do modyfikowania warto skopiować całą klasę, w której mamy dokonać zmian i wkleić ją nad Main (nie przeszkadza to w niczym jak skrypt się dybluje). Uchroni to nasz projekt przed błędami. W późniejszym etapie można usunąć te definicje, których nie zmieniamy, a zostawić tylko te z wprowadzonymi przez nas poprawkami. Program sam powoła się na wcześniejsze definicje. Czemu tak się dzieje? Otóż nawet gdy w swoim projekcie użyjemy skryptów, które zmieniają tę samą klasę, to 'wygra' ten, który jest najbliżej Main. Szerzej na ten temat w innym tutorialu
Co najważniejsze, poniżej zamieszczam instrukcję krok po kroku, jak dodać nowe polecenie w menu.
Tutorial
Spoiler:
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 53)
Kod:
def create_command_window
Jak sama nazwa wskazuje definicja tworzy okno poleceń. Co jest jednak dla nas najważniejsze, znajdują się tu poszczególne zmienne: s1, s2, s3, s4 itd.
Przyglądając się tym zmiennym łatwo zauważyć, że przyporządkowano im jakieś wartości - słowa ('vocab' to skrót od angielskiego 'vocabulary' - słownictwo), a ich tłumaczenie pobierane jest z Bazy Danych z zakładki Terms.
Ale skoro chcemy dodać swoją opcję w menu, to dodajemy na koniec nową zmienną, np. 's7' i odpowiednio ją nazywamy:
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:
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):
Kod:
update_command_selection
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
$scene = Scene_Item.new
when 1,2,3 # Skill, equipment, status
start_actor_selection
when 4 # Save
$scene = Scene_File.new(true, false, false)
when 5 # End Game
$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
$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ć komendę, która przekieruje nas do następnej sceny:
Kod:
$scene = NAZWA.new
NAZWA powinna odpowiadać nazwą nowej sceny, najczęściej polecenie to podane je wraz z nowym skryptem, np.
5. Warto wspomnieć również o tym, że niektóre nowe klasy są włączane dopiero po uprzednim wybraniu bohatera, którego dane ona wyświetla. Na przykład, gdy chcemy wejść w ekwipunek wpierw podświetla się okno po prawej stronie z wyborem postaci (Window_MenuStatus). Jest to przydatne przy dodatkowych skryptach chociażby na rozdawanie statystyk.
Zatem co należy zrobić? Powracamy do fragmentu:
Kod:
case @command_window.index
when 0 # Item
$scene = Scene_Item.new
when 1,2,3 # Skill, equipment, status
start_actor_selection
when 4 # Save
$scene = Scene_File.new(true, false, false)
when 5 # End Game
$scene = Scene_End.new
end
Jak widać przy indeksie 1, 2 i 3 następuje odwołanie do definicji 'start_actor_selection'. Dodajmy zatem po przecinku kolejny indeks, czyli 6:
Kod:
case @command_window.index
when 0 # Item
$scene = Scene_Item.new
when 1,2,3,6 # Skill, equipment, status, komenda
start_actor_selection
when 4 # Save
$scene = Scene_File.new(true, false, false)
when 5 # End Game
$scene = Scene_End.new
end
Następnie przechodzimy do 'update_actor_selection' (linijka 124) i przyglądamy się fragmentowi:
Kod:
case @command_window.index
when 1 # skill
$scene = Scene_Skill.new(@status_window.index)
when 2 # equipment
$scene = Scene_Equip.new(@status_window.index)
when 3 # status
$scene = Scene_Status.new(@status_window.index)
end
Po linijkach:
Kod:
when 3 # status
$scene = Scene_Status.new(@status_window.index)
Dodajemy przed 'end', pamiętając o indeksie naszej komendy:
Kod:
when 6 # komenda
$scene = Scene_NAZWA.new(@status_window.index)
Oczywiście należy zapamiętać, że aby nie pojawił się błąd, scena do której się odwołujemy musi mieć argument indeksu w definicji 'initialize'. Tłumacząc to łopatologicznie na przykładzie 'Scene_Equip', czyli klasie tworzącej okna ekwipunku - przyglądając się bowiem definicji 'initialize' w tej klasie można zobaczyć, że w nawiasach po jej nazwie podane są argumenty '(actor_index = 0, equip_index = 0)', co w tym przypadku oznacza, że odwołując się do tej klasy można podać w nawiasie indeks bohatera oraz indeks ekwipunku. Argumenty te mają przyporządkowane domyślne wartości.
Mam nadzieję, że się przyda Piszcie w razie problemów
Pomógł: 15 razy Dołączył: 20 Kwi 2012 Posty: 186 Skąd: się biorą dzieci?
Wysłany: Pią 20 Lip, 2012 13:40
Mi nie działa... Prawdopodobnie coś źle zrobiłem, ale nie wiem co... Chcę zrobić żeby w menu była jeszcze opcja notatek: http://www.ultimateam.pl/...ghlight=journal
To moje scene_menu
Spoiler:
Kod:
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
# This class performs the menu screen processing.
#==============================================================================
class Scene_Menu < Scene_Base
#--------------------------------------------------------------------------
# * Object Initialization
# menu_index : command cursor's initial position
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# * Start processing
#--------------------------------------------------------------------------
def start
super
create_menu_background
create_command_window
@gold_window = Window_Gold.new(0, 360)
@status_window = Window_MenuStatus.new(160, 0)
end
#--------------------------------------------------------------------------
# * Termination Processing
#--------------------------------------------------------------------------
def terminate
super
dispose_menu_background
@command_window.dispose
@gold_window.dispose
@status_window.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_menu_background
@command_window.update
@gold_window.update
@status_window.update
if @command_window.active
update_command_selection
elsif @status_window.active
update_actor_selection
end
end
#--------------------------------------------------------------------------
# * Create Command Window
#--------------------------------------------------------------------------
def create_command_window
s1 = Vocab::item
s2 = Vocab::skill
s3 = Vocab::equip
s4 = Vocab::status
s5 = Vocab::save
s6 = Vocab::game_end
s7 = "Notatki"
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7])
@command_window.index = @menu_index
if $game_party.members.size == 0 # If number of party members is 0
@command_window.draw_item(0, false) # Disable item
@command_window.draw_item(1, false) # Disable skill
@command_window.draw_item(2, false) # Disable equipment
@command_window.draw_item(3, false) # Disable status
end
if $game_system.save_disabled # If save is forbidden
@command_window.draw_item(4, false) # Disable save
end
end
#--------------------------------------------------------------------------
# * Update Command Selection
#--------------------------------------------------------------------------
def update_command_selection
if Input.trigger?(Input::B)
Sound.play_cancel
$scene = Scene_Map.new
elsif Input.trigger?(Input::C)
if $game_party.members.size == 0 and @command_window.index < 4
Sound.play_buzzer
return
elsif $game_system.save_disabled and @command_window.index == 4
Sound.play_buzzer
return
end
Sound.play_decision
case @command_window.index
when 0 # Item
$scene = Scene_Item.new
when 1,2,3 # Skill, equipment, status
start_actor_selection
when 4 # Save
$scene = Scene_File.new(true, false, false)
when 5 # End Game
$scene = Scene_End.new
when 6 # Notatki
$scene = $scene = Scene_MenuNote.new
end
end
end
#--------------------------------------------------------------------------
# * Start Actor Selection
#--------------------------------------------------------------------------
def start_actor_selection
@command_window.active = false
@status_window.active = true
if $game_party.last_actor_index < @status_window.item_max
@status_window.index = $game_party.last_actor_index
else
@status_window.index = 0
end
end
#--------------------------------------------------------------------------
# * End Actor Selection
#--------------------------------------------------------------------------
def end_actor_selection
@command_window.active = true
@status_window.active = false
@status_window.index = -1
end
#--------------------------------------------------------------------------
# * Update Actor Selection
#--------------------------------------------------------------------------
def update_actor_selection
if Input.trigger?(Input::B)
Sound.play_cancel
end_actor_selection
elsif Input.trigger?(Input::C)
$game_party.last_actor_index = @status_window.index
Sound.play_decision
case @command_window.index
when 1 # skill
$scene = Scene_Skill.new(@status_window.index)
when 2 # equipment
$scene = Scene_Equip.new(@status_window.index)
when 3 # status
$scene = Scene_Status.new(@status_window.index)
end
end
end
end
EDIT: Ayene pomożesz?
________________________ Jeśli pomogłem, daj
Spoiler:
POMÓGŁ
Uwielbiam się bawić na zdarzeniach w VX-ie... Więc jeśli masz jakieś pytanie jak coś zrobić na zdarzeniach to napisz. Jeśli będę wiedział to odpowiem
Ostatnio zmieniony przez Ayene Sob 21 Lip, 2012 22:54, w całości zmieniany 1 raz
Pomógł: 15 razy Dołączył: 20 Kwi 2012 Posty: 186 Skąd: się biorą dzieci?
Wysłany: Sob 21 Lip, 2012 20:42
Dobra naprawiłem to ale, mam następny problem :D
Robi się przerwa ss:
Moje scene_menu
Spoiler:
Kod:
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
# This class performs the menu screen processing.
#==============================================================================
class Scene_Menu < Scene_Base
#--------------------------------------------------------------------------
# * Object Initialization
# menu_index : command cursor's initial position
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# * Start processing
#--------------------------------------------------------------------------
def start
super
create_menu_background
create_command_window
@gold_window = Window_Gold.new(0, 360)
@status_window = Window_MenuStatus.new(160, 0)
end
#--------------------------------------------------------------------------
# * Termination Processing
#--------------------------------------------------------------------------
def terminate
super
dispose_menu_background
@command_window.dispose
@gold_window.dispose
@status_window.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_menu_background
@command_window.update
@gold_window.update
@status_window.update
if @command_window.active
update_command_selection
elsif @status_window.active
update_actor_selection
end
end
#--------------------------------------------------------------------------
# * Create Command Window
#--------------------------------------------------------------------------
def create_command_window
s1 = Vocab::item
s2 = Vocab::skill
s3 = Vocab::equip
s4 = Vocab::status
s5 = Vocab::save
s6 = Vocab::game_end
s7 = "Notatki"
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7])
@command_window.index = @menu_index
if $game_party.members.size == 0 # If number of party members is 0
@command_window.draw_item(0, false) # Disable item
@command_window.draw_item(1, false) # Disable skill
@command_window.draw_item(2, false) # Disable equipment
@command_window.draw_item(3, false) # Disable status
end
if $game_system.save_disabled # If save is forbidden
@command_window.draw_item(4, false) # Disable save
end
end
#--------------------------------------------------------------------------
# * Update Command Selection
#--------------------------------------------------------------------------
def update_command_selection
if Input.trigger?(Input::B)
Sound.play_cancel
$scene = Scene_Map.new
elsif Input.trigger?(Input::C)
if $game_party.members.size == 0 and @command_window.index < 4
Sound.play_buzzer
return
elsif $game_system.save_disabled and @command_window.index == 4
Sound.play_buzzer
return
end
Sound.play_decision
case @command_window.index
when 0 # Item
$scene = Scene_Item.new
when 1,2,3 # Skill, equipment, status
start_actor_selection
when 4 # Save
$scene = Scene_File.new(true, false, false)
when 5 # End Game
$scene = Scene_End.new
when 6 # Notatki
$scene = Scene_MenuNote.new
end
end
end
#--------------------------------------------------------------------------
# * Start Actor Selection
#--------------------------------------------------------------------------
def start_actor_selection
@command_window.active = false
@status_window.active = true
if $game_party.last_actor_index < @status_window.item_max
@status_window.index = $game_party.last_actor_index
else
@status_window.index = 0
end
end
#--------------------------------------------------------------------------
# * End Actor Selection
#--------------------------------------------------------------------------
def end_actor_selection
@command_window.active = true
@status_window.active = false
@status_window.index = -1
end
#--------------------------------------------------------------------------
# * Update Actor Selection
#--------------------------------------------------------------------------
def update_actor_selection
if Input.trigger?(Input::B)
Sound.play_cancel
end_actor_selection
elsif Input.trigger?(Input::C)
$game_party.last_actor_index = @status_window.index
Sound.play_decision
case @command_window.index
when 1 # skill
$scene = Scene_Skill.new(@status_window.index)
when 2 # equipment
$scene = Scene_Equip.new(@status_window.index)
when 3 # status
$scene = Scene_Status.new(@status_window.index)
end
end
end
end
Nie jestem mocny w skryptowaniu
________________________ Jeśli pomogłem, daj
Spoiler:
POMÓGŁ
Uwielbiam się bawić na zdarzeniach w VX-ie... Więc jeśli masz jakieś pytanie jak coś zrobić na zdarzeniach to napisz. Jeśli będę wiedział to odpowiem
Ostatnio zmieniony przez Ayene Sob 21 Lip, 2012 22:54, w całości zmieniany 1 raz
Pomogła: 232 razy Dołączyła: 18 Wrz 2007 Posty: 2424
Wysłany: Sob 21 Lip, 2012 22:53
Skrypt jest dobry. Problem leży w tym, że na pewno masz jakiś inny skrypt, który jest poniżej tego wrzuconego powyżej, który również modyfikuje Scene_Menu. Przejrzyj swoje dodatkowe skrypty i wyszukaj, czy w którymś nie ma fragmentu 'class Scene_Menu'.
Pomógł: 15 razy Dołączył: 20 Kwi 2012 Posty: 186 Skąd: się biorą dzieci?
Wysłany: Nie 22 Lip, 2012 10:49
Rozwiązałem sam ten problem... Mam skrypt Quest Journal, w którym przypadkowo usunąłem nazwę Misji Dlatego tam było to okienko, ale już wszystko działa, dziękuje za pomoc.
________________________ Jeśli pomogłem, daj
Spoiler:
POMÓGŁ
Uwielbiam się bawić na zdarzeniach w VX-ie... Więc jeśli masz jakieś pytanie jak coś zrobić na zdarzeniach to napisz. Jeśli będę wiedział to odpowiem
A czy dałoby się, aby po wejściu w nową komendę w grze wyświetlał się obrazek?
np. Jak wcisnę na tą komendę to wyświetla mi się obrazek z treścią pomocy?
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum