Creazione di una Scena
1.0
1. Introduzione
Per: RPG Maker XP/VX.
Autore: The Sleeping Leonhart;
Descrizione: Questo tutorial descrive come creare una semplice scena in RGSS e fargli fare qualche azione.
Ultima modifica: 8/6/2010;).
Download:
_RGSS__Tutorial_Scene.doc 43K
59 Numero di downloads
2. Tutorial
Creazione di una scena base
Per prima cosa dobbiamo definire il nome della classe della scena che sarà poi il nome con la quale essa verrà richiamata<div class="de1"><span class="kw1">class</span> NOMESCENA</div><div class="de1"> </div><div class="de1"><span class="kw1">end</span></div></div></td></tr></table>Generalmente le scene vengono chiamate con un nome del tipo
<div class="de1">Scene_NOMESCENA</div></div></td></tr></table>In Rpg Maker VX esiste la classe Scene_Base, che è un po’ come la classe Window_Base per le finestre, essa contiene infatti dei metodi comuni usati in quasi tutte le scene, per far ereditare questa classe basta anteporre < Scene_Base davanti al nome della scena, così:
<div class="de1">Scene_NOMESCENA <span class="sy0"><</span> Scene_Base</div></div></td></tr></table>Nel tutorial non userò la classe Scene_Base, ometterla mi permette di spiegarvi la creazione delle scene sia per VX che per XP.
Ora che abbiamo definito la classe dobbiamo iniziare a definire il punto di ingresso di una scena.
Il primo metodo richiamato da una classe è il metodo initialize, noi però non utilizzeremo questo metodo ma bensì il metodo main. Perché ciò?
Andiamo un attimo a dare un sguardo allo script del main, l'ultimo dello script editor, troveremo il seguente codice
<div class="de1"> <span class="kw1">while</span> <span class="re0">$scene</span> != <span class="kw2">nil</span></div><div class="de1"> <span class="re0">$scene</span>.<span class="me1">main</span></div><div class="de1"> <span class="kw1">end</span></div></div></td></tr></table>in pratica Rpg Maker, parte ed inizia un ciclo infinito che termina solo se variabile globale $scene è vuota (e all'inizio non lo è in quanto sopra gli è assegnato il titolo)
all'interno del ciclo viene chiamato il metodo main della scena, ecco perché noi useremo questo metodo per iniziare a costruire la nostra scena.
In realtà non è obbligatorio usare il main per inizializzare le variabili della nostra scena, ma gli script standard e la maggior parte degli script sono strutturati cosi quindi noi li seguiamo a ruota.
Capisco che mi spiego da cani ma se avete domande o dubbi chiedete.
Quindi:
<div class="de1"><span class="kw1">class</span> NOMESCENA</div><div class="de1"> <span class="kw1">def</span> main</div><div class="de1"> </div><div class="de1"> CREAZIONEFINESTRE</div><div class="de1"> </div><div class="de1"> Graphics.<span class="me1">transition</span></div><div class="de1"> <span class="kw3">loop</span> <span class="kw1">do</span></div><div class="de1"> Graphics.<span class="me1">update</span></div><div class="de1"> Input.<span class="me1">update</span></div><div class="de1"> update</div><div class="de1"> <span class="kw1">if</span> <span class="re0">$scene</span> != <span class="kw2">self</span></div><div class="de1"> <span class="kw1">break</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> Graphics.<span class="me1">freeze</span></div><div class="de1"> </div><div class="de1"> DISPOSEFINESTRE</div><div class="de1"> </div><div class="de1"> <span class="kw1">end</span></div><div class="de1"><span class="kw1">end</span></div></div></td></tr></table>Si inizia per prima cosa ad inizializzare le finestre, ma questo ve lo spiego dopo.
Come potete vedere nel main ce un altro ciclo infinito, in questo ciclo vengono aggiornate Grafica (Graphics.update), Input dei tasti (Input.update) e viene chiamato il metodo update
il ciclo termina quando la scena è diversa da se stessa e il main prosegue generalmente effettuando la cancellazione delle finestre.
Piccola parentesi:
Nel VX una volta che si è ereditato da Scene_Base si può omettere il main in quanto è già definito, per inizializzare le finestre viene usato il metodo start mentre per effettuarne il dispose il metodo terminate
Ora per continuare nella spiegazione ho bisogno di almeno una finestra, nel nostro caso ne useremo 2 una selezionabile per le opzioni e una semplice per mostrare lo stato delle nostre azioni.
La finestra selezionabile sarà del tipo Window_Command
Cosa è una Window_Command, è una semplice finestra selezionabile con una lista di voci, un esempio è la finestra de selezione delle voci del titolo o del menu.
La nostra finestra che mostra lo stato delle azioni invece sarà questa:
<div class="de1"><span class="kw1">class</span> Window_Valori <span class="sy0"><</span> Window_Base</div><div class="de1"> <span class="kw1">def</span> initialize</div><div class="de1"> <span class="kw1">super</span><span class="br0">(</span><span class="nu0">160</span>, <span class="nu0">0</span>, <span class="nu0">320</span>, <span class="nu0">192</span><span class="br0">)</span></div><div class="de1"> <span class="kw2">self</span>.<span class="me1">contents</span> = Bitmap.<span class="me1">new</span><span class="br0">(</span>width <span class="sy0">-</span> <span class="nu0">32</span>, height <span class="sy0">-</span> <span class="nu0">32</span><span class="br0">)</span></div><div class="de1"> refresh</div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> </div><div class="de1"> <span class="kw1">def</span> refresh</div><div class="de1"> <span class="kw2">self</span>.<span class="me1">contents</span>.<span class="me1">clear</span></div><div class="de1"> <span class="kw2">self</span>.<span class="me1">contents</span>.<span class="me1">draw_text</span><span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">256</span>, <span class="nu0">32</span>, <span class="st0">"Lo stato della Switch 1 è: #{$game_switches[1]}"</span><span class="br0">)</span></div><div class="de1"> <span class="kw2">self</span>.<span class="me1">contents</span>.<span class="me1">draw_text</span><span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">48</span>, <span class="nu0">256</span>, <span class="nu0">32</span>, <span class="st0">"Lo variabile 1 ha valore: #{$game_variables[1]}"</span><span class="br0">)</span></div><div class="de1"> <span class="kw2">self</span>.<span class="me1">contents</span>.<span class="me1">draw_text</span><span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">96</span>, <span class="nu0">256</span>, <span class="nu0">32</span>, <span class="st0">"Il party possiede #{$game_party.gold} oro"</span><span class="br0">)</span></div><div class="de1"> draw_actor_graphic<span class="br0">(</span>$game_party.<span class="me1">actors</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span>, <span class="nu0">256</span>, <span class="nu0">150</span><span class="br0">)</span></div><div class="de1"> <span class="kw2">self</span>.<span class="me1">contents</span>.<span class="me1">draw_text</span><span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">128</span>, <span class="nu0">256</span>, <span class="nu0">32</span>, <span class="st0">"#{$game_party.actors[0].name} è al livello #{$game_party.actors[0].level}"</span><span class="br0">)</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"><span class="kw1">end</span></div></div></td></tr></table>In Rpg Maker VX sostituite $game_party.actors con $game_party.members
La nostra scena si chiamerà Scene_Opzioni, ora inizializziamo le finestre nel main
<div class="de1"><span class="kw1">class</span> Scene_Opzioni</div><div class="de1"> <span class="kw1">def</span> main</div><div class="de1"> <span class="co1">#Nomi dei comandi</span></div><div class="de1"> comandi = <span class="br0">[</span><span class="st0">"Switch 1"</span>, <span class="st0">"Variabile 1 + 5"</span>, <span class="st0">"Variabile 1 - 3"</span>, <span class="st0">"Oro + 100"</span>, <span class="st0">"#{$game_party.actors[0].name} + 1"</span><span class="br0">]</span></div><div class="de1"> <span class="co1">#Inizializzo le finestre</span></div><div class="de1"> <span class="re1">@finestra_opzioni</span> = Window_Command.<span class="me1">new</span><span class="br0">(</span><span class="nu0">160</span>, comandi<span class="br0">)</span></div><div class="de1"> <span class="re1">@finestra_valori</span> = Window_Valori.<span class="me1">new</span></div><div class="de1"> <span class="co1">#Ciclo Principale</span></div><div class="de1"> Graphics.<span class="me1">transition</span></div><div class="de1"> <span class="kw3">loop</span> <span class="kw1">do</span></div><div class="de1"> Graphics.<span class="me1">update</span></div><div class="de1"> Input.<span class="me1">update</span></div><div class="de1"> update</div><div class="de1"> <span class="kw1">if</span> <span class="re0">$scene</span> != <span class="kw2">self</span></div><div class="de1"> <span class="kw1">break</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> Graphics.<span class="me1">freeze</span></div><div class="de1"> <span class="co1">#Effettuo il dispose di tutte le finestre che ho inizializzato</span></div><div class="de1"> <span class="re1">@finestra_opzioni</span>.<span class="me1">dispose</span></div><div class="de1"> <span class="re1">@finestra_valori</span>.<span class="me1">dispose</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> </div><div class="de1"> <span class="kw1">def</span> update</div><div class="de1"> </div><div class="de1"> <span class="kw1">end</span></div><div class="de1"><span class="kw1">end</span></div></div></td></tr></table>Osservando lo script si nota la variabile comandi alla quale è assegnato una array di stringhe, questo array di stringhe non è altro che la lista dei comandi che la Window_Command mostrerà per noi
sotto assegniamo a delle variabili d'istanza le nostre 2 finestre, Window_Command richiede il passaggio di 2 argomenti, il primo è la larghezza della finestra, il secondo è la lista dei comandi (che noi abbiamo definito sopra)
Dopo il ciclo principale effettuiamo il dispose delle finestre chiamando il relativo metodo, ma che cos'è questo dispose?
Il dispose non è altro che la cancellazione della nostra finestra dallo schermo, se non lo effettuiamo le nostre finestre rimangono visibili anche dopo la chiusura della scena.
Ora andiamo a riempire il metodo update, questo metodo viene chiamato una volta per frame, dentro inseriremo l'update di @finestra_opzioni, necessario per il controllo attraverso i tasti (dell'altra non è necessario), e un controllo tasti:
<div class="de1"> <span class="kw1">def</span> update</div><div class="de1"> <span class="co1">#aggiornamento finestra di selezione</span></div><div class="de1"> <span class="re1">@finestra_opzioni</span>.<span class="me1">update</span></div><div class="de1"> <span class="co1">#Se il tasto B è premuto</span></div><div class="de1"> <span class="kw1">if</span> Input.<span class="me1">trigger</span>?<span class="br0">(</span><span class="re2">Input::B</span><span class="br0">)</span></div><div class="de1"> <span class="co1">#Suona il SE di annullamento</span></div><div class="de1"> <span class="re0">$game_system</span>.<span class="me1">se_play</span><span class="br0">(</span>$data_system.<span class="me1">cancel_se</span><span class="br0">)</span></div><div class="de1"> <span class="co1">#ritorna alla mappa</span></div><div class="de1"> <span class="re0">$scene</span> = Scene_Map.<span class="me1">new</span></div><div class="de1"> <span class="kw1">elsif</span> Input.<span class="me1">trigger</span>?<span class="br0">(</span><span class="re2">Input::C</span><span class="br0">)</span></div><div class="de1"> <span class="co1">#Suona il SE di conferma</span></div><div class="de1"> <span class="re0">$game_system</span>.<span class="me1">se_play</span><span class="br0">(</span>$data_system.<span class="me1">decision_se</span><span class="br0">)</span></div><div class="de1"> <span class="co1">#Controlla l'indice della selezione</span></div><div class="de1"> <span class="kw1">case</span> <span class="re1">@finestra_opzioni</span>.<span class="me1">index</span></div><div class="de1"> <span class="kw1">when</span> <span class="nu0">0</span></div><div class="de1"> <span class="co1">#Inverte lo stato della switch 1</span></div><div class="de1"> <span class="re0">$game_switches</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> = !$game_switches<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span></div><div class="de1"> <span class="kw1">when</span> <span class="nu0">1</span></div><div class="de1"> <span class="co1">#Aumenta la variabile 1 di 5</span></div><div class="de1"> <span class="re0">$game_variables</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> <span class="sy0">+</span>= <span class="nu0">5</span></div><div class="de1"> <span class="kw1">when</span> <span class="nu0">2</span></div><div class="de1"> <span class="co1">#Decrementa la variabile 1 di 3</span></div><div class="de1"> <span class="re0">$game_variables</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> <span class="sy0">-</span>= <span class="nu0">3</span> </div><div class="de1"> <span class="kw1">when</span> <span class="nu0">3</span></div><div class="de1"> <span class="co1">#Il party ottiene 100 oro</span></div><div class="de1"> <span class="re0">$game_party</span>.<span class="me1">gain_gold</span><span class="br0">(</span><span class="nu0">100</span><span class="br0">)</span></div><div class="de1"> <span class="kw1">when</span> <span class="nu0">4</span></div><div class="de1"> <span class="co1">#Aumenta il livello del leader di 1</span></div><div class="de1"> <span class="re0">$game_party</span>.<span class="me1">actors</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span>.<span class="me1">level</span> <span class="sy0">+</span>= <span class="nu0">1</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> <span class="re1">@finestra_valori</span>.<span class="me1">refresh</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> <span class="kw1">end</span></div></div></td></tr></table>Oltre al già citato metodo update di @finestra_opzioni si può notare
<div class="de1">Input.<span class="me1">trigger</span>?<span class="br0">(</span><span class="re2">Input::B</span><span class="br0">)</span></div></div></td></tr></table>Questo metodo controlla se un tasto, in questo caso B (non la lettera il tasto di Rpg Maker), è stato premuto,
oltre a trigger? esistono altri due metodi, ve li elenco è spiego tutti e 3
- press?(TASTO): Determina se TASTO sta venendo premuto
- trigger?(TASTO): Determina se TASTO è stato premuto di nuovo, cioè dopo uno stato di premuto e non premuto.
- repeat?(TASTO): Determina se TASTO è stato premuto e continua ad esserlo.
DOWN, LEFT, RIGHT, UP, A, B, C, X, Y, Z, L, R, SHIFT, CTRL, ALT, F5, F6, F7, F8, F9.
e devono essere preceduti da Input. in quanto costanti di questo modulo.
Inoltre ci sono i metodi dir4 e dir8 che ritornano dei valori numerici in base al tasto direzionale premuto (per i numeri guardate il tastierino numerico), dir8 considera anche le direzioni oblique.
Proseguendo verso il basso troviamo select case la cui variabile di controllo è @finestra_opzioni.index, il metodo index, come è facile intuire, indica l'indice del comando selezionato partendo da 0
ora in base a questo indice ho fatto eseguire diverse azioni alla nostra scena, subito dopo aver eseguito una delle 5 azioni la finestra con i valori viene aggiornata attraverso il metodo refresh.
La nostra scena è conclusa, essa può essere richiamata attraverso
<div class="de1"><span class="re0">$scene</span> = Scene_Opzioni.<span class="me1">new</span></div></div></td></tr></table>
La scena Completa è questa
<div class="de1"><span class="kw1">class</span> Scene_Opzioni</div><div class="de1"> <span class="kw1">def</span> main</div><div class="de1"> <span class="co1">#Nomi dei comandi</span></div><div class="de1"> comandi = <span class="br0">[</span><span class="st0">"Switch 1"</span>, <span class="st0">"Variabile 1 + 5"</span>, <span class="st0">"Variabile 1 - 3"</span>, <span class="st0">"Oro + 100"</span>, <span class="st0">"#{$game_party.actors[0].name} + 1"</span><span class="br0">]</span></div><div class="de1"> <span class="co1">#Inizializzo le finestre</span></div><div class="de1"> <span class="re1">@finestra_opzioni</span> = Window_Command.<span class="me1">new</span><span class="br0">(</span><span class="nu0">160</span>, comandi<span class="br0">)</span></div><div class="de1"> <span class="re1">@finestra_valori</span> = Window_Valori.<span class="me1">new</span></div><div class="de1"> <span class="co1">#Ciclo Principale</span></div><div class="de1"> Graphics.<span class="me1">transition</span></div><div class="de1"> <span class="kw3">loop</span> <span class="kw1">do</span></div><div class="de1"> Graphics.<span class="me1">update</span></div><div class="de1"> Input.<span class="me1">update</span></div><div class="de1"> update</div><div class="de1"> <span class="kw1">if</span> <span class="re0">$scene</span> != <span class="kw2">self</span></div><div class="de1"> <span class="kw1">break</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> Graphics.<span class="me1">freeze</span></div><div class="de1"> <span class="co1">#Effettuo il dispose di tutte le finestre che ho inizializzato</span></div><div class="de1"> <span class="re1">@finestra_opzioni</span>.<span class="me1">dispose</span></div><div class="de1"> <span class="re1">@finestra_valori</span>.<span class="me1">dispose</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> </div><div class="de1"> <span class="kw1">def</span> update</div><div class="de1"> <span class="co1">#aggiornamento finestra di selezione</span></div><div class="de1"> <span class="re1">@finestra_opzioni</span>.<span class="me1">update</span></div><div class="de1"> <span class="co1">#Se il tasto B è premuto</span></div><div class="de1"> <span class="kw1">if</span> Input.<span class="me1">trigger</span>?<span class="br0">(</span><span class="re2">Input::B</span><span class="br0">)</span></div><div class="de1"> <span class="co1">#Suona il SE di annullamento</span></div><div class="de1"> <span class="re0">$game_system</span>.<span class="me1">se_play</span><span class="br0">(</span>$data_system.<span class="me1">cancel_se</span><span class="br0">)</span></div><div class="de1"> <span class="co1">#ritorna alla mappa</span></div><div class="de1"> <span class="re0">$scene</span> = Scene_Map.<span class="me1">new</span></div><div class="de1"> <span class="kw1">elsif</span> Input.<span class="me1">trigger</span>?<span class="br0">(</span><span class="re2">Input::C</span><span class="br0">)</span></div><div class="de1"> <span class="co1">#Suona il SE di conferma</span></div><div class="de1"> <span class="re0">$game_system</span>.<span class="me1">se_play</span><span class="br0">(</span>$data_system.<span class="me1">decision_se</span><span class="br0">)</span></div><div class="de1"> <span class="co1">#Controlla l'indice della selezione</span></div><div class="de1"> <span class="kw1">case</span> <span class="re1">@finestra_opzioni</span>.<span class="me1">index</span></div><div class="de1"> <span class="kw1">when</span> <span class="nu0">0</span></div><div class="de1"> <span class="co1">#Inverte lo stato della switch 1</span></div><div class="de1"> <span class="re0">$game_switches</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> = !$game_switches<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span></div><div class="de1"> <span class="kw1">when</span> <span class="nu0">1</span></div><div class="de1"> <span class="co1">#Aumenta la variabile 1 di 5</span></div><div class="de1"> <span class="re0">$game_variables</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> <span class="sy0">+</span>= <span class="nu0">5</span></div><div class="de1"> <span class="kw1">when</span> <span class="nu0">2</span></div><div class="de1"> <span class="co1">#Decrementa la variabile 1 di 3</span></div><div class="de1"> <span class="re0">$game_variables</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> <span class="sy0">-</span>= <span class="nu0">3</span> </div><div class="de1"> <span class="kw1">when</span> <span class="nu0">3</span></div><div class="de1"> <span class="co1">#Il party ottiene 100 oro</span></div><div class="de1"> <span class="re0">$game_party</span>.<span class="me1">gain_gold</span><span class="br0">(</span><span class="nu0">100</span><span class="br0">)</span></div><div class="de1"> <span class="kw1">when</span> <span class="nu0">4</span></div><div class="de1"> <span class="co1">#Aumenta il livello del leader di 1</span></div><div class="de1"> <span class="re0">$game_party</span>.<span class="me1">actors</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span>.<span class="me1">level</span> <span class="sy0">+</span>= <span class="nu0">1</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> <span class="re1">@finestra_valori</span>.<span class="me1">refresh</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"> <span class="kw1">end</span></div><div class="de1"><span class="kw1">end</span></div></div></td></tr></table>Ricordatevi di copiarvi anche la finestra che ho inserito sopra.
Mi rendo conto che non ho spiegato tutto e non ho spiegato molto chiaramente ma è più semplice di quello che sembra creare una scena.
Prossimamente posterò uno snocciolamento degli script che gestiscono il Menu cosi che possa spiegare un po’ meglio il funzionamento delle scene e perché no dare qualche dritta per personalizzarvi i vostri menu.
Se ci sono domande, dubbi, volete mostrarmi le vostre scene o chiedere consigli/suggerimenti non esitate a postare.