[RGSS3] Eliminare dal menù una o più opzioni
Versione 1.0
Per: RPGMakerVXAce
Autore: Sora Keyblade
Descrizione:
In una vecchia discussione su uno script di KenzoMe su come eliminare l'opzione "Formazione", è stata esposta l'idea di fare un tutorial su come eliminare, indistintamente, una opzione dal menù; visto che Kenzo non l'ha fatto e io sono affamato di rens, me ne occupo io e tagliamo la testa al toro.
La guida cercherà di essere il più comprensibile possibile, anche per chi non ha mai usato l'rgss, e tutte quelle cose che non sono presenti su rpg maker "base" avranno una spiegazione (spero di non dovermi soffermare più di tanto su cose come le variabili!), come per esempio metodi e classi (con annessi esempi)
Ultima Modifica: 11/01/2015
Tutorial:
Premettiamo fin da subito una cosa, RPG Maker, prima di avviare un gioco, analizza tutto il codice che è presente nello script editor, dall'alto verso il basso, e poi lo esegue; probabilmente a prima vista ciò può sembrare una cosa da nulla, ma se sappiamo sfruttare a nostro vantaggio questa cosa il nostro script può risultare più chiaro e ordinato, infatti RPG Maker, quando legge il codice, se trova uno script avente il nome della classe e un metodo uguali ad uno letto prima (quindi più in alto), sovrascriverà il metodo più in alto con quello più in basso; facciamo un esempio per essere più chiari:
class Window_MenuCommand < Window_Command
def self.init_command_position
@@last_command_symbol = nil
end
Queste sono le prime righe di codice della classe "Window_MenuCommand" (7° script sotto "Windows",che andremo ad analizzare passo passo più avanti).
N.B. una classe può essere immaginata come il progetto di un oggetto, quell'insieme di attributi (cioè le sue caratteristiche) e metodi (cioè ciò che sa fare) che permettono in seguito di rendere il progetto (astratto) in un oggetto("concreto"), per esempio la classe "Distributore d'acqua", avrà come attributo il materiale di cui è fatto o il colore, mentre come metodo quello di erogare l'acqua. Inoltre si può notare che Window_MenuCommand è una sottoclasse di Window_Command, infatti per rendere il lavoro più ordinato e con meno ripetizioni a volte si può scegliere di creare una classe madre per poi rendere disponibile le sue funzioni a quelle figlie, per esempio possiamo creare la classe "Televisione" può avere come classi figlie "Televisore a tubo catodico" e "Televisore a schermo piatto", ma in entrambe le classi figlie non sarà presente un metodo come "Accensione" perché presente nella classe madre (di conseguenza una classe madre presenta le caratteristiche generali che possiedo tutte le classi figlie, mentre le classi figlie vanno più nello specifico)
Viene creata la classe Window_MenuCommand, che ha come primo metodo "self.init_command_position", quest'ultimo serve per stabilire la posizione del cursore, ma se per esempio vogliamo modificare la posizione del cursore (non farlo mettere sulla prima opzione, ma sulla seconda), ci basterà scrivere queste semplici righe nell'editor script, sotto materials (o almeno sotto Window_MenuCommand):
class Window_MenuCommand < Window_Command
def self.init_command_position
@@last_command_symbol = :skill
end
end
ed il gioco è fatto, senza neanche toccare il codice originario.
Adesso passiamo all'analisi del codice, perché è buona cosa quando si va a modificare uno script studiarne tutte le parti e visto che Window_MenuCommand è una classe molto semplice, perché non farlo?
class Window_MenuCommand < Window_Command
...
end
Inizializza la classe Window_MenuCommand che è sottoclasse di Window_Command
def self.init_command_position
@@last_command_symbol = nil
end
Questo metodo (come già detto) serve per dare alla macchina la posizione del cursore, all'interno viene inizializzata la variabile di classe " @@last_command_symbol ", se quest'ultima ha valore nullo (nil), l'opzione in cui si troverà il cursore (quando è stato aperto il menù) sarà la prima, mentre se si mette al posto di "nil", per esempio il simbolo ":skill" il cursore si posizionerà su "Abilità" etc
def initialize
super(0, 0)
select_last
end
Qui viene inizializzata la finestra, cioè il menù con le varie opzioni, viene richiamata la funzione inizialize della superclasse/classe madre Window_Command e vengono dati come parametri "0,0", cioé la posizione nello schermo (che sarebbe in alto a sinistra, infatti dovete immaginare lo schermo come un piano cartesiano dove il punto O è in alto a sinistra, invece che in basso a sinistra).
Con "select_last" viene richiamato il metodo "select_last", presente più in basso
def process_ok
@@last_command_symbol = current_symbol
super
end
Scendiamo più in basso, questa è il penultimo metodo, "process_ok", questo metodo modifica il valore di "@@last_command_symbol" con il simbolo corrente (:skill, :item etc)quando viene schiacciato invio, tutto questo cosa significa? Il simbolo corrente è la posizione del cursore nel momento in cui si preme invio, quindi se premiamo Invio quando è su Equipaggia, memorizzerà il simbolo ":equip", però cosa succede quando premiamo Invio su Equipaggia? Prendiamo il controllo di un altro menù (che sia quello accanto dove sono prensenti i pg oppure altri, come quello degli oggetti o degli equipaggiamenti), ma se premiamo esc cosa succede? Torniamo alla finestra principale (quella con Oggetti, Abilità etc) e il cursore punta sull'ultima opzione in cui era posizionato prima di essere schiacciato Invio (proprio quella in cui era stato premuto invio, in questo caso Equipaggia), che è memorizzata nella variabile "@@last_command_symbol", al posto di farlo puntare sulla prima opzione!
"super" invece richiama il metodo "process_ok", presente nella classe madre di Menu_Command (possono esserci superclassi di super classi, come in questo caso), che ,a soldoni, programma il "Quando viene premuto Invio"
def select_last
select_symbol(@@last_command_symbol)
end
Questa è il metodo "select_last" che viene richiamato dal metodo "initialize" appena visto sopra, qui viene richiamato il metodo "select_symbol" della classe madre Window_Command e viene passato come argomento la variabile "@@last_command_symbol" , senza entrare troppo nei dettagli è il metodo che posiziona "materialmente" il cursore
def make_command_list
add_main_commands
add_formation_command
add_original_commands
add_save_command
add_game_end_command
end
Adesso passiamo alla parte interessante e che ci interessa maggiormente, questo metodo (make_command_list), crea le varie opzioni del menù (oggetti, abilità etc), anzi, più precisamente chiama altri metodi che creano le varie opzioni, quindi cosa dovremmo fare per eliminare una opzione? Semplicemente cancellare le istruzioni contenute al loro interno!
Visioniamo uno ad uno i metodi richiamati.
def add_main_commands
add_command(Vocab::item, :item, main_commands_enabled)
add_command(Vocab::skill, :skill, main_commands_enabled)
add_command(Vocab::equip, :equip, main_commands_enabled)
add_command(Vocab::status, :status, main_commands_enabled)
end
"add_main_commands" aggiunge le opzioni/comandi: Item, Skill; Equip, Status, nulla di particolare.
def add_formation_command
add_command(Vocab::formation, :formation, formation_enabled)
end
"add_formation_command" aggiunge l'opzione/comando "Formazione"
def add_original_commands
end
"add_original_commands" non aggiunge nulla (appunto non c'è niente dentro al metodo), ma può essere riempito da una opzione creata dall'utente (come può essere il bestiario per esempio!)
def add_save_command
add_command(Vocab::save, :save, save_enabled)
end
"add_save_command" aggiunge il comando Salva
def add_game_end_command
add_command(Vocab::game_end, :game_end)
end
"add_game_end_command" aggiunge l'opzione "Fine Gioco"
Arrivati a questo punto, avendo compreso come funziona questa classe, non resta che modificarlo! Possiamo muoverci in tre modi diversi (faccio l'esempio di Item e Fine Gioco)
Il primo metodo è semplicemente quello di togliere materialmente ciò che è contenuto nel metodo.
Nel caso di Fine Gioco avviene così
Prima:
def add_game_end_command
add_command(Vocab::game_end, :game_end)
end
Dopo:
def add_game_end_command
end
Mentre nel caso di Item avviene così
Prima:
def add_main_commands
add_command(Vocab::item, :item, main_commands_enabled)
add_command(Vocab::skill, :skill, main_commands_enabled)
add_command(Vocab::equip, :equip, main_commands_enabled)
add_command(Vocab::status, :status, main_commands_enabled)
end
Dopo:
def add_main_commands
add_command(Vocab::skill, :skill, main_commands_enabled)
add_command(Vocab::equip, :equip, main_commands_enabled)
add_command(Vocab::status, :status, main_commands_enabled)
end
Ovviamente se dovete eliminare l'opzione "Skill", cancellerete la seconda riga, per Equip, la terza e così via
Il secondo metodo non si distoglie molto dal primo, ma risulta meno "drastico". In pratica consiste nel mettere prima della riga che vogliamo eliminare il simbolo cancelletto (#), in questo modo tutta la riga alla destra del cancelletto diventerà un commento, quindi non verrà letto da RPG Maker
Nel caso di Item funziona così
def add_main_commands
# add_command(Vocab::item, :item, main_commands_enabled)
add_command(Vocab::skill, :skill, main_commands_enabled)
add_command(Vocab::equip, :equip, main_commands_enabled)
add_command(Vocab::status, :status, main_commands_enabled)
end
mentre nel caso di End Game funziona in questo modo
def add_game_end_command
# add_command(Vocab::game_end, :game_end)
end
Questo secondo metodo è nettamente più consigliato del primo, infatti, se in futuro dovreste pentirvi di aver eliminato quel determinato comando potete benissimo togliere il cancelletto e tutto tornerà come prima, cosa nettamente più pratica di dover creare un nuovo progetto, cercare nel codice sorgente la riga che ci interessa e incollarla nel nostro progetto
In fine, il terzo metodo ed il più consigliato, dovete creare un nuovo script sotto Material (o almeno sotto -Window_MenuCommand-) e utilizzare quella caratteristica di RPGMAker appena descitta sopra, cioè far sovrascrivere il metodo di una classe mettendolo sotto quello base di rpgmkr
class Nome_Classe #nel nostro caso Window_MenuCommand
def Nome_Metodo #nel nostro caso o add_game_end_command oppure add_main_commands
codice modificato
end
end
Questo è il "template" che dovremo utilizzare, nulla di molto complicato, dovremo nominare la classe con lo stesso nome di quella dov'è presente il metodo che dobbiamo modificare (nel nostro caso Window_MenuCommand); ridefinire il metodo, creando un metodo con lo stesso nome (nel nostro caso o add_game_end_command oppure add_main_commands); inserire il codice modificato all'interno del metodo; terminare il metodo e la classe con i due -end-
Ecco come avviene in modo pratico utilizzando i nostri due esempi
Per eliminare Item
class Window_MenuCommand < Window_Command
def add_main_commands
add_command(Vocab::skill, :skill, main_commands_enabled)
add_command(Vocab::equip, :equip, main_commands_enabled)
add_command(Vocab::status, :status, main_commands_enabled)
end
end
Mentre per End Game:
class Window_MenuCommand < Window_Command
def add_game_end_command
end
end
In questo modo, il metodo -add_game_end_command- oppure -add_main_commands- verranno eliminati e sostituiti (cioè sovrascritti) dal codice da voi inserito
Forse risulterà il metodo più lungo, ma quello più maneggievole e pratico da modificare e distribuire, infatti, semplicemente cancellando lo script da voi creato potrete far tornare tutto alla normalità, senza dover mettere mani nel codice e lo potrete distribuire in modo più semplice e compatto, postando semplicemente il codice da voi scritto ed il gioco è fatto ^^
La guida finisce qui, se avete qualche dubbio o consiglio postatelo qua sotto, risponderò a tutti ^^ (se possibile :P)
Modificato da Sora Keyblade, 11 January 2015 - 14:05 PM.