Guida al LUA a cura di psp2000
Questa guida, è indirizzata verso coloro che vogliono iniziare a programmare in LUA su PSP.
È richiesta una conoscenza, anche minima, del LUA. A questo proposito, rimando a QUESTA guida
Indice
1. Introduzione
2. Le funzionalità del LUA su PSP
2.1 Stampare un testo su schermo
2.2 Creare e stampare una immagine
2.3 Creare e stampare una linea
2.4 Creare e stampare un rettangolo
2.5 Caricare e stampare una immagine
2.6 I controlli
2.7 I timer
2.8 Funzionalità di sistema
2.9 Controllare suoni e musica
--------------------------------------------------------------------------------
1. Introduzione
Che cos'è il LUA?
Essenzialmente, il LUA è un linguaggio interpretato.
Non è orientato agli oggetti, ma presenta alcune caratteristiche viste in alcuni linguaggi object oriented.
Perchè programmare in LUA su PSP?
Il motivo, a mio riguardo, è il seguente: questo è un linguaggio molto semplice ed intuitivo, e non si dovrebbero riscontrare difficoltà nell'apprenderlo. Colgo l'occasione per dire che bisogna sapere almeno le basi del LUA. A questo riguardo rimando ad un'altra guida, che troverete qui ( http://www.lua.org/manual/5.1/ ). È in inglese, ma non dovreste avere seri problemi nell'apprendere i concetti base del linguaggio.
Ambiente di sviluppo
Almeno su PSP, si potrebbe scrivere su un semplice documento di testo (.txt) per poi rinominarlo in .LUA. Ma non è questo quello che consiglio di fare. Il mio consiglio è, invece, quello di procurarsi un IDE, per esempio MiroLUA.
Supponiamo di aver scritto il nostro programma in un file script.lua. E ora, come facciamo ad eseguiro su PSP? La risposta è molto semplice: basta procurarsi il LUAPlayer. Questo è un programma che permette non solo di eseguire script LUA su PSP, ma anche su PC. Scariamo LUAPlayer per PSP da questo indirizzo ( http://luaplayer.org/downloads/lp20/LuaPlayer_v0.20_firmware15.zip ) e quello Windows da qui ( http://luaplayer.org/downloads/lp20/luaplayerwindows-0.20.zip ).
Detto questo, possiamo iniziare a programmare.
2. Le funzionalità del LUA su PSP
Trattiamo ora le funzionalità che LUA offre su PSP.
2.1 Stampare un testo su schermo
Iniziamo il tutorial spiegando come stampare un testo sullo schermo della PSP o del PC nel caso di LUAPlayer per Windows.
La funzione che stampa un testo su schermo (o su immagine, concetto che approfondirò) è la seguente:
image:print(posizione x,posizione y,testo da stampare,colore del testo)
Il termine print sta appunto a significare "disegna una stringa in una precisa coordinata". Questa coordinata è espressa nei campi "posizione X" e "posizione y". Nel campo "colore del testo" dobbiamo imettere i valori RGB con la quale verrà stampato il testo. Vediamo un esempio completo: supponiamo di voler stampare a schermo la frase "Hello World". Il codice risulterà essere il seguente:
bianco = Color.new(255,255,255)
while true do
screen:print(100,100,"Hello World",bianco)
screen.waitVblankStart()
screen.flip()
end
Abbiamo attribuito alla variabile bianco la funzione Color.new(r,g,b), che ha il compito di creare un nuovo colore in base ai valori RGB espressi nei campi r,g,b. Dopo di che, con "while true do", inizia il ciclo principale del programma. Subito sotto vediamo la funzione image:print(), già vista prima ma con una piccola particolarità. Al posto di "image" è infatti scritto "screen". La funzione, in questo caso, stampa il testo sullo schermo, molto semplicemente. A proposito ci sarebbero altri aspetti da approfondire, che ometterò. La funzione screen.waitVblankStart() aspetta che lo schermo si aggiorni, e screen.flip() lo aggiorna. Queste due funzioni sono da considerarsi essenziali in qualunque programma.
Avviamo ora il programma (su PSP o su PC) e, se tutto è andato bene, dovrebbe apparire sullo schermo della PSP o sullo schermo del PC la scritta "HelloWorld", su sfondo nero
E se noi volessimo stampare su schermo un testo in movimento? Ci possono essere diverse soluzioni. Quella che propongo io è la seguente:
bianco = Color.new(255,255,255)
x = 100
direzione = 0
while true do
if direzione == 0 then x = x + 2 end
if direzione == 1 then x = x - 2 end
if x == 400 then direzione = 1 end
if x == 10 then direzione = 0 end
screen:print(x,100,"hello world",bianco)
screen.flip()
screen.waitVblankStart()
screen:clear()
end
Color.new() l'abbiamo visto prima, nulla da commentare. Con "x = 100" dichiaro una variabile di valore numerico che va a determinare la coordinata X del testo da stampare. La variabile "direzione", inizializzata su valore 0, ha la funzione di spostare il testo a destra o a sinista in base alla posizione del testo stesso. Infatti, se "posizione" è uguale a 0, il testo si sposterà verso sinistra ( x = x + 2 ). Se uguale ad 1, invece, il testo si sposterà verso destra ( x = x - 2 ).
Con questo "pezzo" di codice
if x == 400 then direzione = 1 end
if x == 10 then direzione = 0 end
metto subito in chiaro che se la posizione X del testo è uguale a 400, il testo stesso si sposterà verso destra. Se invece è uguale a 10, si sposterà verso sinistra.
"screen:print(x,100,"hello world",bianco)" stampa il testo su schermo e "screen:clear()" pulisce lo schermo, "cancella" qualsiasi cosa ci trova stampato sopra (in questo caso cancella il testo).
2.2 Creare e stampare una immagine
Il LUA mette a disposizione diverse funzioni per lavorare con le immagini. Quella che vediamo ora è molto importante, permette di creare una immagine.
Image.createEmpty(larghezza, altezza)
N.B I valori massimi di larghezza e di altezza sono 512.
Vediamo un esempio completo. Vogliamo creare un programmino che crea una immagine rossa e che si muova a destra e a sinistra.
rosso = Color.new(255,0,0) --Inizializzazione colore rosso.
immagine = Image.createEmpty(50,50) --Creo una immagine con larghezza e altezza di 50.
x = 100 --Questa variabile determina la posizione dell'immagine nell'asse X.
direzione = 0 --Se 0: direzione verso destra; se 1 direzione verso sinistra.
while true do
immagine:clear(rosso) --Coloro l'immagine.
if direzione == 0 then x = x + 2 end
if direzione == 1 then x = x - 2 end
if x == 420 then direzione = 1 end
if x == 10 then direzione = 0 end
screen:blit(x,100,immagine) --Stampo l'immagine su schermo.
screen.flip()
screen.waitVblankStart()
screen:clear() --Pulisco lo schermo
end
I commenti li ho fatti direttamente nel codice. La funzione
image:blit(posizione x,posizione y,immagine da stampare)
non l'avevamo ancora vista. Ha il compito di stampare una immagine su schermo.
2.3 Creare e stampare una linea
Con la funzione
image:drawLine(x0, y0, x1, y1, colore)
Viene stampata su schermo una linea che parte dai punti x0,y0 fino ad arrivare ai punti x1,y1. Nel campo "colore" viene specificato il colore (con valori RGB) della linea. Come di consueto, vediamo un esempio:
bianco = Color.new(255,255,255)
posizione_x0 = 50
posizione_y0 = 50
posizione_x1 = 300
posizione_y1 = 200
while true do
screen:drawLine(posizione_x0,posizione_y0,posizione_x1,posizione_y1,bianco)
screen.flip()
screen.waitVblankStart()
end
Nulla di difficile da capire in questo esempio.
2.4 Creare e stampare un rettangolo
Vediamo ora come disegnare su schermo un rettangolo. La funzione è questa:
image:fillRect(x, y, larghezza, altezza, colore)
Nei campi "x" e "y" vengono specificate le coordinate del rettangolo, nei campi "larghezza" e "altezza" specifichiamo appunto la largezza e l'altezza del rettangolo.
Ecco un esempio:
bianco = Color.new(255,255,255)
posizione_x = 50
posizione_y = 50
larghezza = 100
altezza = 50
while true do
screen:fillRect(posizione_x,posizione_y,larghezza,altezza,bianco)
screen.flip()
screen.waitVblankStart()
end
Nulla da commentare.
2.5 Caricare e stampare una immagine
Con LUA è possibile caricare da memory stick una immagine con la funzione
Image.load("nomeimmagine.png")
N.B Sono supportate solamente immagini con formato .PNG e .JEPG
Per stamparla possiamo poi usare la funzione image:blit() vista in precedenza.
Vediamo un esempio completo di un programma che carichi una immagine e la visualizzi su schermo.
immagine = Image.load("immagine.png")
while true do
sreen:blit(100,100,immagine)
screen.flip()
screen.waitVblankStart()
end
Prima di tutto, carichiamo una immagine con nome "immagine.png" e la attribuiamo alla variabile "immagine". Nel ciclo principale, poi, stampiamo l'immagine nella posizione 100,100.
2.6 I controlli.
Con il LUA e' possibile gestire i tasti della PSP, grazie a Controls.read()
Prima di tutto, associamo Controls.read() ad una variabile, per convenzione denominata 'pad'. Dopo di che, posiamo controllare lo stato dei tasti.
Vediamo un semplicissimo esempio:
bg = Image.load("bg.png") --Immagine che usiamo come sfondo.
nero = Color.new(0,0,0)
pad = Controls.read()
while true do
screen:blit(0,0,bg)
if pad:cross() then screen:print(50,50,"Hai premuto X",nero)
end
E' tutto molto semplice, e l'unica linea di codice da commentare e':
if pad:cross() then screen:print(50,50,"Hai premuto X",nero)
Con questo, viene stampata a video la stringa "Hai premuto X" quando viene effettivamente premuto il tasto X.
Un altro esempio:
nero = Color.new(0,0,0)
pad = Controls.read()
while true do
screen:blit(0,0,bg)
if pad:left() and pad:right() then screen:print(50,50,"Hai premuto left e right",nero)
if not pad:left() and not pad:right() then screen:print(50,50,"Non hai premuto left e right",nero)
end
2.6 Funzionalità di sistema.
Il LUAPlayer mette a disposizione diverse funzionalità di sistema. Vediamole in dettaglio.
System.currentDirectory()
System.listDirectory()
System.createDirectory()
System.removeDirectory()
System.removeFile()
System.rename()
System.usbDiskModeActivate()
System.usbDiskModeDeactivate()
System.powerIsPowerOnline()
System.powerIsBatteryExist()
System.powerIsBatteryCharging()
System.powerGetBatteryChargingStatus()
System.powerIsLowBattery()
System.powerGetBatteryLifePercent()
System.powerGetBatteryLifeTime()
System.powerGetBatteryTemp()
System.powerGetBatteryVolt()
System.powerTick()
System.md5sum()
System.sioInit()
System.sioRead()
System.sioWrite()
System.irdaInit()
System.irdaRead()
System.irdaWrite()
System.sleep()
System.getFreeMemory()
premetto che io non ho ancora imparato bene, ma correggetemi in caso ho sbagliato qualcosa