Rpg²S Forum uses cookies. Read the Privacy Policy for more info. To remove this message, please click the button to the right:    I accept the use of cookies

Vai al contenuto

Rpg²S Forum uses cookies. Read the Privacy Policy for more info. To remove this message, please click the button to the right:    I accept the use of cookies

Screen Contest #90

Kamikun






  • Si prega di effettuare il log in prima di rispondere
Eliminare dal menù una o più opzioni [RGSS3]

    Exim Gealbhonn
  • Utente avanzato

  • Utenti
  • Rens: 49
  • 2
  • StellettaStellettaStelletta
  • 355 messaggi
  • Sesso:Maschio
  • Abilità:Esperto

#1 Inviato 03 January 2015 - 20:26 PM

[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.


    Guardian of Irael
  • Coniglietto Rosso

  • Rpg²S Admin
  • Rens: 195
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 58424 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilità:Apprendista


#2 Inviato 03 January 2015 - 20:50 PM

Ottimo, è sempre richiesta comune quella di eliminare una o due opzioni dai menù... potresti spiegare anche come aggiungerle ed occuparti del title pure.

^ ^


(\_/)
(^ ^) <----coniglietto rosso, me!     
(> <)

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^  
 
REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

Spoiler


    Makeratore
  • Arshes (RmXP)

  • Rpg²S Staff
  • Rens: 123
  • 4
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 1905 messaggi
  • Sesso:Maschio
  • Provenienza:Roma
  • Abilità:Esperto

#3 Inviato 03 January 2015 - 21:33 PM

Ottimerrimo!!! Mi serviva una guida del genere! Quando la aggiorni, ti consiglio di fare un nuovo post per avvertire, in modo che sappiamo quando viene aggiornata.


CLICCA SUL BANNER QUI SOTTO PER ENTRARE ANCHE TU NEL GRUPPO VOCALE DISCORD!

 

>>> BIM_Banner2.png <<<

 

Le mie guide:

I miei plugin:

Roba:

Spoiler

    Ste
  • SpaccaUova

  • Rpg²S Mod
  • Rens: 200
  • 4
  • StellettaStellettaStellettaStellettaStelletta
  • 1351 messaggi
  • Sesso:Maschio
  • Provenienza:Italy
  • Abilità:Maestro


#4 Inviato 04 January 2015 - 22:23 PM

Bella guida, hai spiegato benissimo!

Ci conto che la continuerai! ;)



    Exim Gealbhonn
  • Utente avanzato

  • Utenti
  • Rens: 49
  • 2
  • StellettaStellettaStelletta
  • 355 messaggi
  • Sesso:Maschio
  • Abilità:Esperto

#5 Inviato 11 January 2015 - 14:04 PM

Ottimo, è sempre richiesta comune quella di eliminare una o due opzioni dai menù... potresti spiegare anche come aggiungerle ed occuparti del title pure.

^ ^

Grazie mille ^^ Aggiungere opzioni nel menù è una cosa molto semplice, il problema è cosa mettere all'interno di quel comando XD

Volendo posso aggiungerlo a questa guida, mettendo una roba semplice come "Quando premi l'opzione -Hello World- compare una finestra con su scritto 'Hello World'" o roba del genere, oppure fare un'altra guida con della roba un po' più complicata (consigli?), secondo te qual è meglio? xD

 

Per il title, credo che in futuro lo farò ^^

 

 

 

Ottimerrimo!!! Mi serviva una guida del genere! Quando la aggiorni, ti consiglio di fare un nuovo post per avvertire, in modo che sappiamo quando viene aggiornata.

 
 

Bella guida, hai spiegato benissimo!

Ci conto che la continuerai! ;)

 

 

Grazie del sostegno ^^

 

Guida Completata



    Guardian of Irael
  • Coniglietto Rosso

  • Rpg²S Admin
  • Rens: 195
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 58424 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilità:Apprendista


#6 Inviato 11 January 2015 - 14:14 PM

Io intendevo script già fatti da inserire, quindi mettere il semplice richiama scena per quello script particolare.

^ ^


(\_/)
(^ ^) <----coniglietto rosso, me!     
(> <)

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^  
 
REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

Spoiler


    Exim Gealbhonn
  • Utente avanzato

  • Utenti
  • Rens: 49
  • 2
  • StellettaStellettaStelletta
  • 355 messaggi
  • Sesso:Maschio
  • Abilità:Esperto

#7 Inviato 13 January 2015 - 14:42 PM

Io intendevo script già fatti da inserire, quindi mettere il semplice richiama scena per quello script particolare.

^ ^

Lo farò di certo  :sisi:






  • Feed RSS