Spoiler
RPG MAKER XP
GUIDA AL RUBY
PARTE I
Guida generale a cura di: Æliath
Premessa a cura di: Time
RPG Maker XP ha portato una bella ventata d'aria fresca nel mondo dei maker amatoriali! E questo lo dobbiamo principalmente al sistema di scripting basato su un vero e proprio linguaggio di programmazione: il Ruby. E' ovvio quindi che il tool della ASCII/Enterbrain, anche se rimane pur sempre un programma per creare giochi amatoriali, risulta essere sicuramente molto più professionale rispetto ai suoi "fratelli" minori.
Purtroppo però, questa maggiore professionalità, si traduce il più delle volte in un aumento esponenziale della complessità! Questa Guida tenderà quindi a soffermarsi prevalentemente su questo aspetto, cercando di rendere il più familiare possibile termini, istruzioni, comandi che potrebbero risultare più che ostici a chi è abituato ai semplici eventi di RPG Maker 2000 o 2003!
La Guida sarà suddivisa sostanzialmente in due grandi capitoli: il primo sarà dedicato alle regole del Ruby in quanto tale, mentre nel secondo cercheremo di applicare tali regole per la creazione o la modifica di script specifici.
Prima di iniziare, vorrei riportare un'introduzione al Ruby scritta dal mio "collega" Time:
Non è necessario imparare il ruby per creare un bel gioco con rmXP. Non dovrebbe inoltre essere motivo di particolare vergogna copia-incollare uno script pubblico. Né dovrebbe essere considerato ladro o incapace chi utilizzi un BS laterale preso da un qualche sito. Scrivo tutto questo perché sarei felice di vedere un clima sempre più di collaborazione e vorrei vedere offrire script tanto generosamente quanto risorse grafiche.
A cosa serve il ruby ad un normale utilizzatore di rmXP?
Molti di voi già lo sapranno, comunque ribadirlo non farà male: con il ruby possiamo modificare molti aspetti dello scheletro del nostro gioco. Utenti di rm2k esperti lamentavano spesso gli astrusi giri usati per personalizzare, quando possibile, parti del proprio gioco. Adesso è tutto più limpido. Se non ci piace il menù, il BS, come si muove il nostro eroe etc, abbiamo davanti a noi lo script che svolge quella funzione e possiamo capire come lavora e poi modificarlo.
Mi limiterò a dirvi che il linguaggio nacque alcuni anni fa ad opera di un programmatore giapponese e negli ultimi anni, dopo un notevole successo in patria e in Asia, si sta imponendo anche dalle nostre parti. Per chi si stesse chiedendo “Ma allora Ruby è un vero linguaggio di programmazione?” la risposta è “Sì.”. Potrete trovare la definizione linguaggio di scripting ma la sostanza è la stessa: potremmo definire “linguaggio di scripting”, un linguaggio “leggero” e piuttosto veloce da scrivere e imparare.
Chi prima di oggi ha utilizzato soltanto rm2k o, chessò, l’HTML potrebbe trovare qualche piccola difficoltà (anche d’approccio) nell’affrontare un linguaggio di programmazione. Troveremo comunque similitudini rispetto alla programmazione con rm2k: variabili, cicli….
Nel ruby, come nella stragrande maggioranza dei linguaggi di programmazione, ogni operazione verrà eseguita via testo: dovrete scrivere i comandi che rmXP dovrà eseguire, niente pulsanti per quanto riguarda lo scripting. E già spunta una novità rispetto alla programmazione in rm2k: gli errori. Se scriverete un lungo script ci sarà un’ottima probabilità che all’interno vi sia un errore. Basta sbagliare una lettera (anche scrivere una maiuscola al posto di una minuscola!) in un comando per non far funzionare tutto lo script. Prendetelo come un avvertimento e una rassicurazione: attenti a non sbagliare ma non preoccupatevi di un eventuale errore, succede a tutti.
Ringraziate Time per questa ottima premessa ( XD ), ma non vi preoccupate: lo rincontreremo anche nelle prossime puntate di questa Guida dove ci spiegherà cosucce interessanti come Array, Condizioni SE, Cicli e compagnia bella!
1. RUBY: QUESTO SCONOSCIUTO
Con questa sezione della Guida andremo ad apprendere quelle che sono le regole sintattiche basilari del Ruby. Prima di parlare di Script, Menù o BS sarà infatti fondamentale imprimere per bene nella mente concetti come quelli di Classe, Metodo, Oggetto, Variabile e così via…
Ovviamente, chi avrà già una certa esperienza nel campo della programmazione potrà trovare queste nozioni ripetitive e fin troppo semplificative, ma lo scopo di questa parte della guida sarà - come già accennato - esclusivamente quello di introdurre il semplice utente abituato ai comandi-eventi di RPG Maker 2000 ad un ambiente di lavoro un po' più professionale e complesso!
1.1CHE COS'E' IL RUBY?
Il Ruby è un linguaggio di programmazione orientato agli oggetti!
Ai più forse questa definizione potrà non dire assolutamente nulla, ma riassume alla perfezione la logica su cui si basa l'intero linguaggio!
Cerchiamo di spiegare parola per parola tale definizione…
Innanzitutto: cos'è un linguaggio di programmazione?
Detto in parole povere, un linguaggio di programmazione è un insieme di regole sintattiche (ovvero la forma con cui scriviamo le varie istruzioni) associate ad una corrispondente semantica (cioè il significato di tali forme). L'obiettivo? Creare un programma che risolva un determinato problema posto. Conoscere la sintassi di un linguaggio sarà ovviamente il primo passo di una lunga sequenza di operazioni che ci porterà all'esecuzione vera e propria del nostro programma!
I linguaggi di programmazione possono essere suddivisi in diverse categorie: linguaggi come il C o il Pascal ad esempio, sono chiamati Linguaggi Procedurali in quanto la struttura di un programma non è altro che un insieme di procedure e funzioni. Il Java, il C++ e lo stesso Ruby sono invece Linguaggi orientati agli Oggetti poiché si basano su tre elementi fondamentali: la Classe, l'Oggetto ed il Metodo (non è propriamente così, ma per semplicità prendete per buona tale definizione).
Chi ha già avuto esperienza con linguaggi tipo C++ o Java, potrà facilmente notare che anche il Ruby viaggia sugli stessi binari… ma non solo: per certi versi potrà risultare anche più immediato ed intuitivo rispetto ai suoi ben più noti "cugini"!
1.2CLASSI, OGGETTI E METODI
Dando un'occhiata generale agli script di RPG Maker XP, potrete facilmente notare che su ognuno di essi campeggia - all'inizio del codice vero e proprio - un bel class Nome_Classe (ad es. class Window_Message o class Scene_Menu)!
Che cos'è quindi una Classe? Il primo concetto che mi viene in mente è quello di modello!
Già! Una classe non è altro che un modello in cui sono descritte tutta una serie di caratteristiche, attributi ed operazioni!
Il problema però è che la classe, così com'è, è praticamente inutilizzabile in quanto è sì un modello, ma un modello astratto! Per fare un paragone più o meno azzardato, è come la ricetta di una torta! In una ricetta normalmente sono descritti tutti gli ingredienti necessari nonché tutte le operazioni per preparare il piatto in questione, però alla fin fine rimangono pur sempre delle semplici parole su carta. Scordiamoci di poter mangiare la torta senza mettere in pratica le istruzioni riportate nella ricetta! Ed è questo il concetto che dobbiamo tenere bene a mente: "mettere in pratica"!
Se nell'esempio della torta il "mettere in pratica" significa prendere fisicamente gli ingredienti, mescolarli tra di loro, preparare l'impasto, mettere in forno il tutto ecc… ecc…, meno immediato invece sarà assimilare il medesimo concetto per ciò che concerne il Ruby o la programmazione ad oggetti in generale!
In realtà la cosa è più semplice di quello che potrebbe sembrare!
Una volta che definiamo una classe, avremo bisogno di un "qualcosa" che renda concreti gli attributi e le operazioni della classe in questione. Questo "qualcosa" non è altro che l'Oggetto. Gli oggetti quindi non sono altro che la rappresentazione fisica e concreta della nostra classe… questo significa quindi che, grazie all'oggetto, potremo finalmente interagire con quegli attributi e quelle operazioni definite all'interno del nostro modello!
Come facciamo a creare un oggetto?
Semplice! Tramite un comando denominato new.
La sintassi sarà una cosa del tipo:
nome_var = nome_Classe.new(parametri)
dove nome_var sarà una variabile associata all'oggetto (ma delle variabili parleremo in dettaglio più avanti), nome_Classe sarà appunto il nome della classe in questione, mentre tra le parentesi avremo una sequenza di parametri indispensabili per inizializzare l'oggetto (opzionali o meno a seconda dei casi).
Tale operazione di creazione di un oggetto prenderà il nome di Istanziazione, mentre l'oggetto così creato potrà essere ridenominato Istanza.
Abbiamo accennato al fatto che in una classe normalmente vengono definiti degli attributi e delle operazioni! Gli attributi servono sostanzialmente per definire le caratteristiche e le qualità di un oggetto appartenente ad una determinata classe e normalmente vengono identificati mediante delle variabili d'istanza (come già detto, delle variabili parleremo in dettaglio in un paragrafo a parte, comunque vi basti sapere che le variabili d'istanza si riconoscono dal carattere @ prima del nome). Le operazioni invece prendono il nome di Metodi e rappresentano sicuramente l'elemento più vicino a quelle che erano le funzioni o le procedure di linguaggi come il C o il Pascal! Per fare un azzardato paragone con RPG Maker diciamo che i Metodi ricordano vagamente gli Eventi Comuni. Qual era lo scopo di un Evento Comune? Sostanzialmente quello di eseguire una determinata operazione! Quindi noi selezionavamo il nostro Evento Comune, descrivevamo le azioni che l'evento doveva compiere e poi questo veniva richiamato all'interno del gioco principale quando ne avevamo bisogno!
Beh, a grandi linee anche il Metodo funziona allo stesso modo. E' proprio grazie ai Metodi che possiamo eseguire delle operazioni tra oggetti e - perché no - anche mettere in comunicazione una classe con un'altra!
Riconoscere la definizione di un metodo è abbastanza semplice in quanto si presenta in una forma del tipo:
def Nome_Metodo
. . .
end
Per richiamare invece un metodo la cosa è ancora più semplice in quanto basterà riportare unicamente il nome del metodo stesso (più eventuali parametri) nel punto del programma in cui serve!
Comunque non vi preoccupate, tutti questi elementi verranno ripresi e analizzati passo passo a partire dalla prossima parte della Guida. La cosa fondamentale in questa sede invece sarà quella di comprendere e assimilari per benino questi concetti basilari!
Ricapitolando…
La Classe è un modello astratto in cui definiamo degli attributi e delle operazioni.
L'Oggetto consiste in una rappresentazione concreta di una classe.
L'operazione di creazione di un oggetto prende il nome di Istanziazione e lo stesso oggetto può prendere il nome di Istanza.
Gli attributi definiti in una classe sono rappresentati mediante Variabili d'istanza.
Le operazioni definite all'interno di una classe prendono il nome di Metodi.
1.3ESEMPIO DI UNA CLASSE
Dopo tutte queste parole non ci resta che mettere in pratica i concetti appena visti!
Iniziamo quindi da un esempio molto semplice di una classe denominata Book. Come si può facilmente intuire dal nome, tale classe servirà per gestire dei libri! Supponiamo che la nostra classe abbia un aspetto del tipo:
class Book
attr_accessor :titolo
attr_accessor :autore
def initialize
@titolo = "Silmarillion"
@autore = "Tolkien"
end
end
Possiamo facilmente notare che la classe in questione è costituita da due attributi (titolo e autore) e da un metodo (initialize). Gli attributi - come già accennato nel paragrafo precedente - sono rappresentati da variabili d'istanza (@titolo e @autore) a cui abbiamo assegnato le stringhe "Silmarillion" e "Tolkien" (per il concetto di assegnamento vi rimando al paragrafo successivo). Affinchè le variabili d'istanza possano essere però considerate degli attributi a tutti gli effetti, dovremo utilizzare la seguente sintassi all'inizio della classe (al di fuori cioè di qualsiasi metodo definito):
attr_accessor :nome_Attributo
La parola chiave attr_accessor serve per stabilire che una variabile (nel nostro caso @titolo e/o @autore) può essere utilizzata sia in fase di scrittura che in fase di lettura cioè, data un'istruzione di assegnamento (vedere paragrafo successivo), può comparire sia alla destra che alla sinistra del simbolo di =. In alternativa potremo indicare l'attributo come attr_writer (solo fase di scrittura) oppure come attr_reader (solo fase di lettura).
A questo punto vediamo di creare un oggetto a partire dalla classe Book. La sintassi, ripredendo la regola generale vista nel paragrafo precedente, sarà una cosa del tipo:
@libro = Book.new
Tramite il comando new quindi creiamo un oggetto a partire dalla classe Book e lo associamo alla variabile @libro. Abbiamo detto che l'oggetto non è altro che la rappresentazione concreta di una classe, quindi nel nostro caso l'istanza appena creata andrà ad "ereditare" tutti gli attributi e tutti i metodi definiti nella classe di appartenenza ovvero gli attributi titolo ed autore ed il metodo initialize. In particolar modo quest'ultimo sarà un metodo particolare in quanto la sua funzione principale sarà quella di inizializzare l'oggetto appena creato, ovvero - nel nostro caso - associare ai due attributi presenti le stringhe "Silmarillion" e "Tolkien".
Una volta creato l'oggetto, come facciamo ad interagire con - ad esempio - l'attributo titolo? Tramite una notazione puntata del tipo:
@libro.titolo
dove @libro è la variabile associata all'oggetto in questione e titolo è, appunto, l'attributo che a noi interessa. Infatti se a questo punto andassimo ad utilizzare il comando print (o p) su tale notazione puntata ( print @libro.titolo ) apparirebbe una bella finestrella con su scritta la stringa "Silmarillion".
Naturalmente potremo in qualsiasi momento modificare il contenuto degli attributi mediante semplici istruzioni di assegnamento del tipo:
@libro.titolo = "Pinocchio"
@libro.autore = "Collodi"
Una classe definita in questo modo però, non è certo il massimo della flessibilità in quanto ogni oggetto che andremo a creare verrà sempre inizializzato con le stringhe "Silmarillion" e "Tolkien".
Vediamo adesso come definire una classe in cui saremo noi ad inizializzare un oggetto nel momento della sua creazione:
class Book
attr_accessor :titolo
attr_accessor :autore
def initialize(title, author)
@titolo = title
@autore = author
end
end
La differenza rispetto al caso precedente riguarda il metodo initialize. Infatti, in questo frangente, potremo notare delle parentesi tonde in cui all'interno compaiono due argomenti (title e author) i quali verranno passati alle variabili d'istanza @titolo e @autore. Questo significa che quando andremo a creare un nuovo oggetto con il comando new dovremo anche passare degli argomenti (in questo caso due stringhe) che verranno assegnati agli attributi. Quindi la nostra istruzione di istanziazione avrà un aspetto del tipo:
@libro = Book.new("Silmarillion", "Tolkien")
Queste che ho proposto sono soltanto due versioni di una semplice classe di base, comunque se vorrete vedere una versione "pratica" di tale tipologia di modello vi basterà aprire il vostro RPG Maker XP e dare una sbirciatina allo script Game_Temp.
1.4LE VARIABILI
Fino a questo momento abbiamo continuamente parlato di variabili ma, cos'è di preciso una Variabile? Da un punto di vista prettamente tecnico, la variabile non è altro che una locazione di memoria capace di contenere un qualsiasi tipo di informazione (numeri interi, numeri reali, caratteri, stringhe ecc… ecc…). Nella quasi totalità dei linguaggi di programmazione questo fatto comportava una dichiarazione iniziale della variabile, cioè bisognava "dire" al programma che tipo di informazione la variabile in questione doveva contenere! Questa fase - per fortuna - nel Ruby è stata eliminata.
Ogni variabile poi è associata ad un identificatore, ovvero ad un nome che assegnamo noi in modo totalmente arbitrario!
Ovviamente però dovremo seguire delle regolette:
il nome di una variabile può essere costituito da lettere e cifre numeriche ma deve necessariamente iniziare con una lettera (o al massimo con il carattere _ ): ad esempio il nome 3D non è corretto mentre i nomi _3D o var2 lo sono.
L'identificatore non può essere uguale ad una parola chiave del linguaggio e non può contenere determinati simboli come ad esempio gli operatori aritmetici ( *, -, /, +, %), gli operatori di confronto ( =, >, < ), le parentesi e via dicendo…
Il Ruby (così come altri linguaggi) gode della proprietà del Case-Sensitive, ovvero mette in risalto la differenza tra lettere minuscole e lettere maiuscole, quindi ad esempio una variabile denominata canzone sarà diversa da una variabile denominata invece Canzone o CANZONE.
Stabilito il nome della variabile, vediamo come assegnarle un qualsiasi tipo di informazione. Questo è possibile tramite l'operatore di assegnamento =.
nome_Variabile = Info
Questa istruzione così semplice prende il nome di istruzione di assegnamento. Ecco alcuni esempi:
anno = 2004
ciao = 5.28
controllo = true
voto = 'B'
saluto = "ciao"
var1 = ciao
Anche in questo frangente avremo alcune regolette da rispettare: nel primo caso abbiamo assegnato un numero intero, mentre nel secondo un numero reale (con virgola). I numeri normalmente si assegnano in modo diretto. I caratteri invece si devono racchiudere tra apici (quarto esempio), mentre le stringhe (cioè sequenze di caratteri) tra virgolette (quinto caso). Perché tutte queste accortezze? Semplicemente per non creare confusione! Infatti se le stringhe venissero assegnate senza virgolette, si potrebbero confondere con gli identificatori di eventuali variabili presenti. Nel quinto esempio infatti abbiamo assegnato alla variabile saluto la stringa ciao, mentre nel sesto esempio abbiamo assegnato alla variabile var1 il contenuto (5.28, ovvero un numero reale) di un'altra variabile (ciao): concetto questo ben diverso dal caso precedente! Infine nel terzo esempio abbiamo assegnato un valore booleano. Una variabile booleana infatti può assumere soltanto due valori: true (vero) e false (falso). In questo caso non servono le virgolette.
Passiamo ora ad elencare i vari tipi di variabili che potremo incontrare in un programma in Ruby:
nome_Variabile: se l'identificatore di una variabile non presenta alcun simbolo particolare all'inizio del nome stesso, allora vorrà dire che avremo a che fare con una variabile locale, cioè una variabile che potrà essere impiegata unicamente all'interno della classe o del metodo in cui è stata definita.
$nome_Variabile: se è presente il simbolo $ davanti all'identificatore di una variabile, allora stiamo parlando di una variabile globale, cioè una variabile che potrà essere impiegata in qualsiasi momento e in qualsiasi luogo (anche in classi differenti)!
@nome_Variabile: come abbiamo già visto in precedenza, una variabile il cui nome inizia con il simbolo @ sarà una variabile d'istanza, cioè una variabile che dipenderà dall'oggetto in questione e che - normalmente - verrà utilizzata per definirne gli attributi.
@@nome_Variabile: a differenza della variabile d'istanza, una variabile di classe non dipenderà più dal singolo oggetto, bensì dall'intera classe e potrà essere impiegata da tutti gli oggetti creati a partire dalla suddetta classe.
GUIDA AL RUBY
PARTE I
Guida generale a cura di: Æliath
Premessa a cura di: Time
RPG Maker XP ha portato una bella ventata d'aria fresca nel mondo dei maker amatoriali! E questo lo dobbiamo principalmente al sistema di scripting basato su un vero e proprio linguaggio di programmazione: il Ruby. E' ovvio quindi che il tool della ASCII/Enterbrain, anche se rimane pur sempre un programma per creare giochi amatoriali, risulta essere sicuramente molto più professionale rispetto ai suoi "fratelli" minori.
Purtroppo però, questa maggiore professionalità, si traduce il più delle volte in un aumento esponenziale della complessità! Questa Guida tenderà quindi a soffermarsi prevalentemente su questo aspetto, cercando di rendere il più familiare possibile termini, istruzioni, comandi che potrebbero risultare più che ostici a chi è abituato ai semplici eventi di RPG Maker 2000 o 2003!
La Guida sarà suddivisa sostanzialmente in due grandi capitoli: il primo sarà dedicato alle regole del Ruby in quanto tale, mentre nel secondo cercheremo di applicare tali regole per la creazione o la modifica di script specifici.
Prima di iniziare, vorrei riportare un'introduzione al Ruby scritta dal mio "collega" Time:
Non è necessario imparare il ruby per creare un bel gioco con rmXP. Non dovrebbe inoltre essere motivo di particolare vergogna copia-incollare uno script pubblico. Né dovrebbe essere considerato ladro o incapace chi utilizzi un BS laterale preso da un qualche sito. Scrivo tutto questo perché sarei felice di vedere un clima sempre più di collaborazione e vorrei vedere offrire script tanto generosamente quanto risorse grafiche.
A cosa serve il ruby ad un normale utilizzatore di rmXP?
Molti di voi già lo sapranno, comunque ribadirlo non farà male: con il ruby possiamo modificare molti aspetti dello scheletro del nostro gioco. Utenti di rm2k esperti lamentavano spesso gli astrusi giri usati per personalizzare, quando possibile, parti del proprio gioco. Adesso è tutto più limpido. Se non ci piace il menù, il BS, come si muove il nostro eroe etc, abbiamo davanti a noi lo script che svolge quella funzione e possiamo capire come lavora e poi modificarlo.
Mi limiterò a dirvi che il linguaggio nacque alcuni anni fa ad opera di un programmatore giapponese e negli ultimi anni, dopo un notevole successo in patria e in Asia, si sta imponendo anche dalle nostre parti. Per chi si stesse chiedendo “Ma allora Ruby è un vero linguaggio di programmazione?” la risposta è “Sì.”. Potrete trovare la definizione linguaggio di scripting ma la sostanza è la stessa: potremmo definire “linguaggio di scripting”, un linguaggio “leggero” e piuttosto veloce da scrivere e imparare.
Chi prima di oggi ha utilizzato soltanto rm2k o, chessò, l’HTML potrebbe trovare qualche piccola difficoltà (anche d’approccio) nell’affrontare un linguaggio di programmazione. Troveremo comunque similitudini rispetto alla programmazione con rm2k: variabili, cicli….
Nel ruby, come nella stragrande maggioranza dei linguaggi di programmazione, ogni operazione verrà eseguita via testo: dovrete scrivere i comandi che rmXP dovrà eseguire, niente pulsanti per quanto riguarda lo scripting. E già spunta una novità rispetto alla programmazione in rm2k: gli errori. Se scriverete un lungo script ci sarà un’ottima probabilità che all’interno vi sia un errore. Basta sbagliare una lettera (anche scrivere una maiuscola al posto di una minuscola!) in un comando per non far funzionare tutto lo script. Prendetelo come un avvertimento e una rassicurazione: attenti a non sbagliare ma non preoccupatevi di un eventuale errore, succede a tutti.
Ringraziate Time per questa ottima premessa ( XD ), ma non vi preoccupate: lo rincontreremo anche nelle prossime puntate di questa Guida dove ci spiegherà cosucce interessanti come Array, Condizioni SE, Cicli e compagnia bella!
1. RUBY: QUESTO SCONOSCIUTO
Con questa sezione della Guida andremo ad apprendere quelle che sono le regole sintattiche basilari del Ruby. Prima di parlare di Script, Menù o BS sarà infatti fondamentale imprimere per bene nella mente concetti come quelli di Classe, Metodo, Oggetto, Variabile e così via…
Ovviamente, chi avrà già una certa esperienza nel campo della programmazione potrà trovare queste nozioni ripetitive e fin troppo semplificative, ma lo scopo di questa parte della guida sarà - come già accennato - esclusivamente quello di introdurre il semplice utente abituato ai comandi-eventi di RPG Maker 2000 ad un ambiente di lavoro un po' più professionale e complesso!
1.1CHE COS'E' IL RUBY?
Il Ruby è un linguaggio di programmazione orientato agli oggetti!
Ai più forse questa definizione potrà non dire assolutamente nulla, ma riassume alla perfezione la logica su cui si basa l'intero linguaggio!
Cerchiamo di spiegare parola per parola tale definizione…
Innanzitutto: cos'è un linguaggio di programmazione?
Detto in parole povere, un linguaggio di programmazione è un insieme di regole sintattiche (ovvero la forma con cui scriviamo le varie istruzioni) associate ad una corrispondente semantica (cioè il significato di tali forme). L'obiettivo? Creare un programma che risolva un determinato problema posto. Conoscere la sintassi di un linguaggio sarà ovviamente il primo passo di una lunga sequenza di operazioni che ci porterà all'esecuzione vera e propria del nostro programma!
I linguaggi di programmazione possono essere suddivisi in diverse categorie: linguaggi come il C o il Pascal ad esempio, sono chiamati Linguaggi Procedurali in quanto la struttura di un programma non è altro che un insieme di procedure e funzioni. Il Java, il C++ e lo stesso Ruby sono invece Linguaggi orientati agli Oggetti poiché si basano su tre elementi fondamentali: la Classe, l'Oggetto ed il Metodo (non è propriamente così, ma per semplicità prendete per buona tale definizione).
Chi ha già avuto esperienza con linguaggi tipo C++ o Java, potrà facilmente notare che anche il Ruby viaggia sugli stessi binari… ma non solo: per certi versi potrà risultare anche più immediato ed intuitivo rispetto ai suoi ben più noti "cugini"!
1.2CLASSI, OGGETTI E METODI
Dando un'occhiata generale agli script di RPG Maker XP, potrete facilmente notare che su ognuno di essi campeggia - all'inizio del codice vero e proprio - un bel class Nome_Classe (ad es. class Window_Message o class Scene_Menu)!
Che cos'è quindi una Classe? Il primo concetto che mi viene in mente è quello di modello!
Già! Una classe non è altro che un modello in cui sono descritte tutta una serie di caratteristiche, attributi ed operazioni!
Il problema però è che la classe, così com'è, è praticamente inutilizzabile in quanto è sì un modello, ma un modello astratto! Per fare un paragone più o meno azzardato, è come la ricetta di una torta! In una ricetta normalmente sono descritti tutti gli ingredienti necessari nonché tutte le operazioni per preparare il piatto in questione, però alla fin fine rimangono pur sempre delle semplici parole su carta. Scordiamoci di poter mangiare la torta senza mettere in pratica le istruzioni riportate nella ricetta! Ed è questo il concetto che dobbiamo tenere bene a mente: "mettere in pratica"!
Se nell'esempio della torta il "mettere in pratica" significa prendere fisicamente gli ingredienti, mescolarli tra di loro, preparare l'impasto, mettere in forno il tutto ecc… ecc…, meno immediato invece sarà assimilare il medesimo concetto per ciò che concerne il Ruby o la programmazione ad oggetti in generale!
In realtà la cosa è più semplice di quello che potrebbe sembrare!
Una volta che definiamo una classe, avremo bisogno di un "qualcosa" che renda concreti gli attributi e le operazioni della classe in questione. Questo "qualcosa" non è altro che l'Oggetto. Gli oggetti quindi non sono altro che la rappresentazione fisica e concreta della nostra classe… questo significa quindi che, grazie all'oggetto, potremo finalmente interagire con quegli attributi e quelle operazioni definite all'interno del nostro modello!
Come facciamo a creare un oggetto?
Semplice! Tramite un comando denominato new.
La sintassi sarà una cosa del tipo:
nome_var = nome_Classe.new(parametri)
dove nome_var sarà una variabile associata all'oggetto (ma delle variabili parleremo in dettaglio più avanti), nome_Classe sarà appunto il nome della classe in questione, mentre tra le parentesi avremo una sequenza di parametri indispensabili per inizializzare l'oggetto (opzionali o meno a seconda dei casi).
Tale operazione di creazione di un oggetto prenderà il nome di Istanziazione, mentre l'oggetto così creato potrà essere ridenominato Istanza.
Abbiamo accennato al fatto che in una classe normalmente vengono definiti degli attributi e delle operazioni! Gli attributi servono sostanzialmente per definire le caratteristiche e le qualità di un oggetto appartenente ad una determinata classe e normalmente vengono identificati mediante delle variabili d'istanza (come già detto, delle variabili parleremo in dettaglio in un paragrafo a parte, comunque vi basti sapere che le variabili d'istanza si riconoscono dal carattere @ prima del nome). Le operazioni invece prendono il nome di Metodi e rappresentano sicuramente l'elemento più vicino a quelle che erano le funzioni o le procedure di linguaggi come il C o il Pascal! Per fare un azzardato paragone con RPG Maker diciamo che i Metodi ricordano vagamente gli Eventi Comuni. Qual era lo scopo di un Evento Comune? Sostanzialmente quello di eseguire una determinata operazione! Quindi noi selezionavamo il nostro Evento Comune, descrivevamo le azioni che l'evento doveva compiere e poi questo veniva richiamato all'interno del gioco principale quando ne avevamo bisogno!
Beh, a grandi linee anche il Metodo funziona allo stesso modo. E' proprio grazie ai Metodi che possiamo eseguire delle operazioni tra oggetti e - perché no - anche mettere in comunicazione una classe con un'altra!
Riconoscere la definizione di un metodo è abbastanza semplice in quanto si presenta in una forma del tipo:
def Nome_Metodo
. . .
end
Per richiamare invece un metodo la cosa è ancora più semplice in quanto basterà riportare unicamente il nome del metodo stesso (più eventuali parametri) nel punto del programma in cui serve!
Comunque non vi preoccupate, tutti questi elementi verranno ripresi e analizzati passo passo a partire dalla prossima parte della Guida. La cosa fondamentale in questa sede invece sarà quella di comprendere e assimilari per benino questi concetti basilari!
Ricapitolando…
La Classe è un modello astratto in cui definiamo degli attributi e delle operazioni.
L'Oggetto consiste in una rappresentazione concreta di una classe.
L'operazione di creazione di un oggetto prende il nome di Istanziazione e lo stesso oggetto può prendere il nome di Istanza.
Gli attributi definiti in una classe sono rappresentati mediante Variabili d'istanza.
Le operazioni definite all'interno di una classe prendono il nome di Metodi.
1.3ESEMPIO DI UNA CLASSE
Dopo tutte queste parole non ci resta che mettere in pratica i concetti appena visti!
Iniziamo quindi da un esempio molto semplice di una classe denominata Book. Come si può facilmente intuire dal nome, tale classe servirà per gestire dei libri! Supponiamo che la nostra classe abbia un aspetto del tipo:
class Book
attr_accessor :titolo
attr_accessor :autore
def initialize
@titolo = "Silmarillion"
@autore = "Tolkien"
end
end
Possiamo facilmente notare che la classe in questione è costituita da due attributi (titolo e autore) e da un metodo (initialize). Gli attributi - come già accennato nel paragrafo precedente - sono rappresentati da variabili d'istanza (@titolo e @autore) a cui abbiamo assegnato le stringhe "Silmarillion" e "Tolkien" (per il concetto di assegnamento vi rimando al paragrafo successivo). Affinchè le variabili d'istanza possano essere però considerate degli attributi a tutti gli effetti, dovremo utilizzare la seguente sintassi all'inizio della classe (al di fuori cioè di qualsiasi metodo definito):
attr_accessor :nome_Attributo
La parola chiave attr_accessor serve per stabilire che una variabile (nel nostro caso @titolo e/o @autore) può essere utilizzata sia in fase di scrittura che in fase di lettura cioè, data un'istruzione di assegnamento (vedere paragrafo successivo), può comparire sia alla destra che alla sinistra del simbolo di =. In alternativa potremo indicare l'attributo come attr_writer (solo fase di scrittura) oppure come attr_reader (solo fase di lettura).
A questo punto vediamo di creare un oggetto a partire dalla classe Book. La sintassi, ripredendo la regola generale vista nel paragrafo precedente, sarà una cosa del tipo:
@libro = Book.new
Tramite il comando new quindi creiamo un oggetto a partire dalla classe Book e lo associamo alla variabile @libro. Abbiamo detto che l'oggetto non è altro che la rappresentazione concreta di una classe, quindi nel nostro caso l'istanza appena creata andrà ad "ereditare" tutti gli attributi e tutti i metodi definiti nella classe di appartenenza ovvero gli attributi titolo ed autore ed il metodo initialize. In particolar modo quest'ultimo sarà un metodo particolare in quanto la sua funzione principale sarà quella di inizializzare l'oggetto appena creato, ovvero - nel nostro caso - associare ai due attributi presenti le stringhe "Silmarillion" e "Tolkien".
Una volta creato l'oggetto, come facciamo ad interagire con - ad esempio - l'attributo titolo? Tramite una notazione puntata del tipo:
@libro.titolo
dove @libro è la variabile associata all'oggetto in questione e titolo è, appunto, l'attributo che a noi interessa. Infatti se a questo punto andassimo ad utilizzare il comando print (o p) su tale notazione puntata ( print @libro.titolo ) apparirebbe una bella finestrella con su scritta la stringa "Silmarillion".
Naturalmente potremo in qualsiasi momento modificare il contenuto degli attributi mediante semplici istruzioni di assegnamento del tipo:
@libro.titolo = "Pinocchio"
@libro.autore = "Collodi"
Una classe definita in questo modo però, non è certo il massimo della flessibilità in quanto ogni oggetto che andremo a creare verrà sempre inizializzato con le stringhe "Silmarillion" e "Tolkien".
Vediamo adesso come definire una classe in cui saremo noi ad inizializzare un oggetto nel momento della sua creazione:
class Book
attr_accessor :titolo
attr_accessor :autore
def initialize(title, author)
@titolo = title
@autore = author
end
end
La differenza rispetto al caso precedente riguarda il metodo initialize. Infatti, in questo frangente, potremo notare delle parentesi tonde in cui all'interno compaiono due argomenti (title e author) i quali verranno passati alle variabili d'istanza @titolo e @autore. Questo significa che quando andremo a creare un nuovo oggetto con il comando new dovremo anche passare degli argomenti (in questo caso due stringhe) che verranno assegnati agli attributi. Quindi la nostra istruzione di istanziazione avrà un aspetto del tipo:
@libro = Book.new("Silmarillion", "Tolkien")
Queste che ho proposto sono soltanto due versioni di una semplice classe di base, comunque se vorrete vedere una versione "pratica" di tale tipologia di modello vi basterà aprire il vostro RPG Maker XP e dare una sbirciatina allo script Game_Temp.
1.4LE VARIABILI
Fino a questo momento abbiamo continuamente parlato di variabili ma, cos'è di preciso una Variabile? Da un punto di vista prettamente tecnico, la variabile non è altro che una locazione di memoria capace di contenere un qualsiasi tipo di informazione (numeri interi, numeri reali, caratteri, stringhe ecc… ecc…). Nella quasi totalità dei linguaggi di programmazione questo fatto comportava una dichiarazione iniziale della variabile, cioè bisognava "dire" al programma che tipo di informazione la variabile in questione doveva contenere! Questa fase - per fortuna - nel Ruby è stata eliminata.
Ogni variabile poi è associata ad un identificatore, ovvero ad un nome che assegnamo noi in modo totalmente arbitrario!
Ovviamente però dovremo seguire delle regolette:
il nome di una variabile può essere costituito da lettere e cifre numeriche ma deve necessariamente iniziare con una lettera (o al massimo con il carattere _ ): ad esempio il nome 3D non è corretto mentre i nomi _3D o var2 lo sono.
L'identificatore non può essere uguale ad una parola chiave del linguaggio e non può contenere determinati simboli come ad esempio gli operatori aritmetici ( *, -, /, +, %), gli operatori di confronto ( =, >, < ), le parentesi e via dicendo…
Il Ruby (così come altri linguaggi) gode della proprietà del Case-Sensitive, ovvero mette in risalto la differenza tra lettere minuscole e lettere maiuscole, quindi ad esempio una variabile denominata canzone sarà diversa da una variabile denominata invece Canzone o CANZONE.
Stabilito il nome della variabile, vediamo come assegnarle un qualsiasi tipo di informazione. Questo è possibile tramite l'operatore di assegnamento =.
nome_Variabile = Info
Questa istruzione così semplice prende il nome di istruzione di assegnamento. Ecco alcuni esempi:
anno = 2004
ciao = 5.28
controllo = true
voto = 'B'
saluto = "ciao"
var1 = ciao
Anche in questo frangente avremo alcune regolette da rispettare: nel primo caso abbiamo assegnato un numero intero, mentre nel secondo un numero reale (con virgola). I numeri normalmente si assegnano in modo diretto. I caratteri invece si devono racchiudere tra apici (quarto esempio), mentre le stringhe (cioè sequenze di caratteri) tra virgolette (quinto caso). Perché tutte queste accortezze? Semplicemente per non creare confusione! Infatti se le stringhe venissero assegnate senza virgolette, si potrebbero confondere con gli identificatori di eventuali variabili presenti. Nel quinto esempio infatti abbiamo assegnato alla variabile saluto la stringa ciao, mentre nel sesto esempio abbiamo assegnato alla variabile var1 il contenuto (5.28, ovvero un numero reale) di un'altra variabile (ciao): concetto questo ben diverso dal caso precedente! Infine nel terzo esempio abbiamo assegnato un valore booleano. Una variabile booleana infatti può assumere soltanto due valori: true (vero) e false (falso). In questo caso non servono le virgolette.
Passiamo ora ad elencare i vari tipi di variabili che potremo incontrare in un programma in Ruby:
nome_Variabile: se l'identificatore di una variabile non presenta alcun simbolo particolare all'inizio del nome stesso, allora vorrà dire che avremo a che fare con una variabile locale, cioè una variabile che potrà essere impiegata unicamente all'interno della classe o del metodo in cui è stata definita.
$nome_Variabile: se è presente il simbolo $ davanti all'identificatore di una variabile, allora stiamo parlando di una variabile globale, cioè una variabile che potrà essere impiegata in qualsiasi momento e in qualsiasi luogo (anche in classi differenti)!
@nome_Variabile: come abbiamo già visto in precedenza, una variabile il cui nome inizia con il simbolo @ sarà una variabile d'istanza, cioè una variabile che dipenderà dall'oggetto in questione e che - normalmente - verrà utilizzata per definirne gli attributi.
@@nome_Variabile: a differenza della variabile d'istanza, una variabile di classe non dipenderà più dal singolo oggetto, bensì dall'intera classe e potrà essere impiegata da tutti gli oggetti creati a partire dalla suddetta classe.
Allega File(s)
- RUBY.txt 19.16K 98 Numero di downloads