Altro [Lua]Guida alla programmazione

Stato
Discussione chiusa ad ulteriori risposte.

Zanna

Utente Diamond
27 Gennaio 2013
5,012
390
2,146
2,342
Ho cercato nel forum ma guide per programmazione del lua non ce ne sono, per questa guida bisogna avere un minimo di conoscenze di informatica ma nnt di difficile. Se volete scrivete su un file .txt e rinominate in .lua per vedere i progressi ;) pian pianp coprirò tutti i linguaggi di programmazione spero che vi piaciano le guide ;).

LUA:

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 ( Lua 5.1 Reference Manual - contents ). È 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
Detto questo, possiamo iniziare a programmare.

ANALIZZIAMO LE FUNZIONI:

Trattiamo ora le funzionalità che LUA offre su PSP.

VISUALIZZARE SCRITTE SULLO 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).

CREARE E VISUALIZZARE UN IMMAGINE SU SCHERMO:
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.

CREARE E STAMPARE UN 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.

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.

CARICARE E STAMPARE UN 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.

ANALIZIAMO 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

FUNZIONALITA' 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()
 
Mmmmmmhhhhhh... La guida è assolutamente ottima, merita rilievo.
Peccato l'oggetto in se della guida, cioè i linguaggi, sono ormai passati, prova a farne qualcuna su C#, C++ o Java :asd:
 
Bravo ...
Il +1 Lo Meriti xD


- - - Updated - - -

Non Posso Darti Il +1 xD
Mi Dispiace​
 
Se devi fare una guida falla per bene, spieghi ben poco del lua qui, ti limiti a spiegare le api di disegno (su psp tra l'altro, non so se su pc son le stesse)
Elenchi poi le api di sistema della PSP ma non ne spieghi il fuonzionamento, mah...
 
Stato
Discussione chiusa ad ulteriori risposte.