Ogłoszenie 

Uwaga! To forum jest w trybie offline.
Wszelką pomoc uzyskasz pod adresem
forum.ultimateam.pl


Administracja Forum


Poprzedni temat «» Następny temat
Nowa komenda w menu?
Autor Wiadomość
Ayene 




Ranga RM:
4 gry

Pomogła: 232 razy
Dołączyła: 18 Wrz 2007
Posty: 2424
Wysłany: Sro 13 Lip, 2011 12:50
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 18)
Kod:
def main

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):
Kod:
def update_command

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:
Kod:
$scene = NAZWA.new

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.


Mam nadzieję, że się przyda ;-) Piszcie w razie problemów :->
________________________


 
 
 
FilipsO 




Preferowany:
RPG Maker VX

Ranga RM:
1 gra

Pomógł: 1 raz
Dołączył: 21 Maj 2010
Posty: 236
Skąd: z nikąd
Wysłany: Sro 13 Lip, 2011 14:32
Przydałoby się cuś takiego do vx, bo tam skrypt jest trochę inny :-/ . Ale ogólnie SUPER.
________________________
89% graczy uważa, że najważniejsza jest grafika.
Jeśli należysz do pozostałych 11% wklej to do swojego podpisu.

Moja Gra MMORPG Erathia:
 
 
Melvin 




Preferowany:
RPG Maker XP

Ranga RM:
1 gra

Pomógł: 35 razy
Dołączył: 23 Paź 2009
Posty: 1063
Wysłany: Sro 13 Lip, 2011 23:08
Ładnie. Przyda się dla newbie :P
Dodam jeszcze, że nie trzeba pisać tak:
Kod:
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])

Tylko można od razu zamiast "s1", pisać swój tekst :lol:
________________________
MelvinClass:
Spoiler:

 
 
Malian 




Preferowany:
RPG Maker XP

Pomógł: 3 razy
Dołączył: 22 Gru 2009
Posty: 262
Skąd: Warszawa
Wysłany: Czw 14 Lip, 2011 12:40
A ja mam do tego skryptu kilka pytań... Co oznacza w linijce
Kod:
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])

liczba 160?

Drugie pytanie: jak usunąć liczbe kroków i czas gry?
________________________
 
 
 
 
Ayene 




Ranga RM:
4 gry

Pomogła: 232 razy
Dołączyła: 18 Wrz 2007
Posty: 2424
Wysłany: Czw 14 Lip, 2011 13:42
Jest podane w tutorialu:
Cytat:
160 - to szerokość okna poleceń (można ją dowolnie zmieniać)


Usunięcie czasu gry i liczby kroków:
Znajdź i usuń:
Kod:
    # Make play time window
    @playtime_window = Window_PlayTime.new
    @playtime_window.x = 0
    @playtime_window.y = 224
    # Make steps window
    @steps_window = Window_Steps.new
    @steps_window.x = 0
    @steps_window.y = 320

Znajdź i usuń:
Kod:
    @playtime_window.dispose
    @steps_window.dispose

Znajdź i usuń:
Kod:
    @playtime_window.update
    @steps_window.update
________________________


 
 
 
Malian 




Preferowany:
RPG Maker XP

Pomógł: 3 razy
Dołączył: 22 Gru 2009
Posty: 262
Skąd: Warszawa
Wysłany: Czw 14 Lip, 2011 14:18
Jaki ślepy jestem! :shock:
Dziękuję. :przytul:
________________________
 
 
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group | Template Klam by Ayene