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 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.
Kod:
s1 = Vocab::item
s2 = Vocab::skill
s3 = Vocab::equip
s4 = Vocab::status
s5 = Vocab::save
s6 = Vocab::game_end

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:
Kod:
s1 = Vocab::item
s2 = Vocab::skill
s3 = Vocab::equip
s4 = Vocab::status
s5 = Vocab::save
s6 = Vocab::game_end
s7 = "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:
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.
Kod:
$scene = Scene_MonsterBook.new
$scene = Scene_Dziennik.new


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 :->
________________________


 
 
 
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 18:28
Noooo! Na to czekałem. Teraz da się system waypoint w menu zrobić.
Good robota ;-)
________________________
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:
 
 
mekil 




Dołączył: 08 Sie 2011
Posty: 4
Wysłany: Pią 19 Sie, 2011 21:23
jej :-P
________________________
zapraszam na moje konto YT-http://www.youtube.com/user/milten132
 
 
aragorn7015 




Preferowany:
RPG Maker VXAce

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  
 
 
 
Ayene 




Ranga RM:
4 gry

Pomogła: 232 razy
Dołączyła: 18 Wrz 2007
Posty: 2424
Wysłany: Sob 21 Lip, 2012 19:43
Nie:
Kod:
$scene = $scene = Scene_MenuNote.new

tylko
Kod:
$scene = Scene_MenuNote.new
________________________


 
 
 
aragorn7015 




Preferowany:
RPG Maker VXAce

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 :mrgreen:
________________________
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  
 
 
 
Ayene 




Ranga RM:
4 gry

Pomogła: 232 razy
Dołączyła: 18 Wrz 2007
Posty: 2424
Wysłany: Sob 21 Lip, 2012 21:59
Wrzuć jeszcze raz screena, bo nie wczytuje.
________________________


 
 
 
aragorn7015 




Preferowany:
RPG Maker VXAce

Pomógł: 15 razy
Dołączył: 20 Kwi 2012
Posty: 186
Skąd: się biorą dzieci?
Wysłany: Sob 21 Lip, 2012 22:49
http://www.freeimagehosting.net/jvbh6
Proszę...
________________________
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
 
 
 
Ayene 




Ranga RM:
4 gry

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'.
________________________


 
 
 
aragorn7015 




Preferowany:
RPG Maker VXAce

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 :-D 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
 
 
 
pw1602 



Preferowany:
RPG Maker VX

Pomógł: 11 razy
Dołączył: 09 Paź 2011
Posty: 119
Wysłany: Wto 24 Lip, 2012 16:35
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?
________________________



 
 
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