lunedì 30 giugno 2014

Incorporare i font

Quando si scrive un programma può essere necessario specificare i font che debbono essere utilizzati. Ci possono essere necessità grafiche, di spazi o di caratteri speciali da dover utilizzare.
Per fortuna Livecode permette di scegliere i font in maniera molto semplice con un'interfaccia grafica intuitiva:

Quando inserite un elemento con del testo, potete modificare le sue proprietà con il Property Inspector. Selezionate la voce Text Formatting dal menu a tendina e avrete la seguente finestra a disposizione:

Se lasciate in bianco la voce Font saranno usati i font del sistema, altrimenti verranno caricati quelli che selezionerete.
Alla voce Size potete scegliere la dimensione che preferite, se non c'è tra quelle del menu a tendina, potete digitarla a mano.
I pulsanti della voce Style vi permetto di impostare lo stile di tutto il paragrafo tra:
  • normale
  • grassetto (bold)
  • corsivo (italic)
  • sottolineato (underlined)
  • con una cornice attorno
  • con una cornice ad effetto 3D
  • colorato e sottolineato come un link
  • sbarrato
I pulsanti alla voce Align permettono di scegliere se allineato a sinistra, centro o destra.
La voce Margins si riferisce al rettangolo dell'oggetto con i quadratini per allargarlo o restringerlo che appare in modalità Edit; non ha a che fare con il box che appare attorno al testo.
Esistono molte altri proprietà che potete impostare solo attraverso il codice, ma la più importante per me è htmltext. Questa proprietà vi permette di inserire in un singolo testo più stili contemporaneamente, come se allo stesso modo di una pagina HTML, e vale per qualsiasi oggetto, anche i campi editabili dall'utente.
Per esempio se mettete in una finestra del testo ("label1") e un pulsante con il seguente codice:

on mouseUp
   put "<h1>Titolo 1</h1>" after temp
   put "<h2>Titolo 2</h2>" after temp   
   put "Questo e' un esempio di testo con piu' stili contemporaneamente. Ecco un elenco puntato:" after temp
   put "<ul>" after temp
   put "<li>primo elemento</li>" after temp
   put "<li>secondo elemento</li>" after temp
   put "</ul>" after temp
   put "Ecco un link: <a >www.livecode.com</a>" after temp
   set the htmltext of field "label1" to temp
end mouseUp


Premendo il pulsante otterrete questo:

Come vedete è attivo anche il link, ma solo dalla proprietà htmlText non è possibile impostare l'azione che succede cliccandoci sopra. Per fortuna il codice da aggiungere al campo di testo per ottenere dei link funzionanti cliccandoci sopra è piccolissimo, eccolo:

on linkClicked pLink
   launch url pLink
end linkClicked


Come vedete il messaggio linkClicked prende in automatico come argomento il testo del link, quindi nello stesso testo è possibile mettere molti link e per ognuno di essi cliccandoci sopra si andrà sulla rispettiva pagina.

venerdì 27 giugno 2014

Costruire il gioco Frogger in 10 minuti o meno

In questo post proverò a spiegare come fare un gioco come "Frogger". Frogger è un gioco vecchissimo, dove il giocatore controlla una rana che tenta di attraversare un'autostrada, cercando di non venire investita dalle macchine.
Chiaramente rimarrò sul semplice, giusto per far vedere alcuni principi base e come si riesca a fare tutto in meno di 10 minuti!
Siete pronti con il cronometro? Bene...via!
Prima di tutto creiamo un nuovo programma andando su File -> New Mainstack.In questo modo avremo una nuova finestra con cui lavorare.
Creiamo i seguenti elementi:
  • pulsante Start
  • un cerchietto verde chiamandolo rana 
  • una rettangolo rosa che chiameremo car1
  • un grosso rettangolo verde scuro chiamandolo arrivo
  • mettere la scritta ARRIVO sopra il rettangolo verde
 Se tutto è stato fatto correttamente avremo il seguente risultato:

Adesso mettiamo nella card corrente (l'unica del programma) il seguente codice per muovere la rana con le frecce della tastiera:

on arrowkey puls
   if the giostat of me is "attivo" then
      switch puls
         case "up"
            move graphic "rana" relative 0,-30         
            break         
         case "down"
            move graphic "rana" relative 0,30         
            break
         case "left"
            move graphic "rana" relative -30,0
            break               
         case "right"
            move graphic "rana" relative 30,0
            break         
      end switch
      if intersect(graphic rana,graphic arrivo) then
         set the giostat of this card to "fermo"
         answer "Hai vinto!"
      end if      
   end if
end arrowkey



Siamo già arrivati a metà del lavoro, ora dobbiamo scrivere il codice per muovere la macchina da sinistra a destra e riposizionarla di nuovo al punto di partenza quando ha percorso tutta la finestra. Immaginando la finestra larga 400 pixels, il codice è:

on iniziagioco
   set the percorso of me to true
   controint
   gioco
end iniziagioco

on moveStopped
   put the percorso of me into temp
   set the percorso of me to not temp
   if the giostat of this card is "attivo" then
      send gioco to me in 0.1 millisec
   end if   
end moveStopped

on gioco   
   put the percorso of me into temp
   if temp then
      move me relative 400,0 in 3 sec without waiting
      else
         move me relative -400,0 in 1 millisec without waiting
      end if
end gioco

on controint
   if intersect(graphic rana, me) then
      set the giostat of this card to "fermo"
      stop moving me         
      answer "Aaaaah! La rana e' morta!"
   end if   
   if the giostat of this card is "attivo" then
      send controint to me in 0.1 sec
   end if      
end controint



Adesso è meglio spiegare il codice appena scritto.
Iniziagioco è il messaggio che deve ricevere la macchina per cominciare a muoversi. Una vola ricevuto, comincerà ad andare da sinistra a destra per 400 pixels e riposizionarsi al punto di partenza finchè la proprietà giostat della carta corrente diventa "fermo" (non è più "attivo"). Inventarsi una proprietà della carta è una scelta comoda, perchè così la vedono tutti (macchine, rana, ecc.) e si può fermare tutto il gioco cambiandone il suo valore. Sempre dentro questo messaggio parte controint, un messaggio che si ripete ogni 0.1 secondi per vedere se la rana è investita dalla macchina.
I messaggi gioco e Movestopped servono per muovere la macchina effettivamente. Visto che intendiamo mettere 6 macchine, ognuna con velocità diverse, è meglio optare per il comando move without waiting; in questo modo non abbiamo problemi di sincronizzazione col move generale e abbiamo il messaggio MoveStopped  che viene lanciato in automatico dal programma quando la macchina ha finito di muoversi.

Bene adesso copiate la macchina per arrivare ad un totale di sei macchine (copiando la macchina, viene copiato anche il codice). Cambiate i nomi delle macchine in modo che siano numerate da car1 a car6 , divertitevi a cambiare la lunghezza delle macchine. Inoltre nel codice di ogni singola macchina divertitevi a cambiare il tempo in secondi che impiega a fare un passaggio.
Come in una autostrada vera, creeremo due sensi di marcia, quindi facciamo in modo che le ultime tre macchine  tre (car4, car5 e car6) si muovano da destra a sinistra cambiando i 400 in -400 e viceversa nel loro codice .
Se tutto è andato per il verso giusto avrete ottenuto qualcosa simile a questo:

Abbiamo quasi finito manca solo il codice del pulsante start:


on mouseUp
   set the loc of graphic rana to 200,300
   set the giostat of this card to "attivo"
   repeat with i=1 to 3
      set the left of graphic ("car" & i) to the left of this card
   end repeat
   repeat with i=4 to 6
      set the right of graphic ("car" & i) to the right of this card
   end repeat
   repeat with i=1 to 6
      send "iniziagioco" to graphic ("car" & i)
   end repeat
end mouseUp


FATTO! Quanto ci avete messo?
Come vedete il codice del pulsante start mette macchine e rana al i posti di partenza e dal il segnale di partenza alle macchine.
Questo è solo un semplice esempio, il gioco può essere notevolmente migliorato ad esempio:
  • sostituendo la grafica con delle immagini animate e/o animazioni
  • considerando la lunghezza del mezzo nel codice del moviemento
  • generando configurazioni di partenza con velocità e quantità dei mezzi casuali ogni volta
  • visto che move può far muovere lungo qualunque serie di punti, si potrebbero immaginare percorsi con curve, diramazioni, ecc.
  • aggiungendo timer e punteggi
Se volete, postate nei commenti  link alle vostre versioni di questo esempio.

giovedì 26 giugno 2014

Valentina DB

Se avete letto gli ultimi post, Livecode può interagire con molti database, tra cui Valentina. Questo database merita un discorso a parte, perchè, oltre a poter funzionare come tutti i database basati su SQL, è anche un NOSQL database.
Per chi non lo sapesse i database NOSQL stanno prendendo piede in molte realtà come Amazon, Ebay e altri ambiti dove si ha a che fare tanti dati non uniformi. Per riassumere in poche parole un database NOSQL è come lavorare con un database classico dove le tabelle hanno righe e colonne come al solito, ma non tutte le righe hanno un valore per tutte le colonne. Facciamo un semplice esempio: immaginiamo di creare una tabelle con le colonne NOME e COGNOME, poi ad un certo punto della tabella ad una persona vogliamo aggiungere SECONDO NOME senza dover aggiungere il secondo nome a tutte le altre righe; con il metodo NOSQL è possibile.
Il vantaggio del NOSQL risiede nel poter estrarre alcuni dati senza dover pensare ad astruse query di ricerca che incorporino alcuni risultati ed escludino altri.
Valentina è sia gratuito che a pagamento, a seconda della licenza che vi serve. Potete usare insieme Livecode e Valentina per sperimentare i vantaggi dei database NOSQL.

mercoledì 25 giugno 2014

Connettersi ad un database MicrosfotSQL Server

Riprendendo l'ultimo post, ecco la riga di codice necessaria a connettersi ad un database Microsoft SQL server:



put revOpenDatabase("ODBC","DRIVER=SQL Server;SERVER=server_name;DATABASE=database_name;UID=username;PWD=password;Trusted_Connection=No",,,) into connID

martedì 24 giugno 2014

Lavorare con i database

Livecode puo' lavorare con qualunque database. Livecode ha integrato SQLite, ma potete interfacciarci con qualunque database cha abbia una interfaccia ODBC (quasi tutti ce l'hanno), ecco i piu' popolari:
  • SQLite
  • MySQL
  • Oracle
  • PostgreSQL
  • Valentina
I database sono, di solito, dei file esterni al nostro programma che possono essere sullo stesso pc su cui gira il nostro programma o su un server remoto. I database contengono tantissime informazioni catalogate. Grazie ai database noi possiamo ricercare informazioni, inserire o cancellare dei dati, tutto secondo particolari criteri che impostiamo noi.
Il linguaggio utilizzato da quasi tutti i database è il SQL. Generalmente i comandi validi per un database, valgono anche per tutti gli altri.
Riassumendo in poche parole un database, si può affermare che si tratta di una raccolta di tabelle, dentro ogni tabella i dati sono organizzati per righe e per colonne.
I database hanno dei vantaggi:
  • veloci a trovare i dati che si servono tra migliaia di dati
  • occupano poco spazio
  • sono ottimizzati per fare il loro lavoro
  • sono velocissimi
  • si riescono ad incrociare i dati di piu' tabelle facilmente
Potreste fare le stesse cose di un database con una matrice, ma trattando molti dati, vi consiglio di imparare ad utilizzare i database.

Connessione

Per utilizzare un database bisogna prima connettersi ad un database, utilizzando la funzione revOpenDatabase() e memorizzare l'identificato della connessione. Per esempio con SQLite si scrivera':

put revOpenDatabase("sqlite", "./mioDB.sqlite", , , , ) into connID




in questo esempio la variabile connID contiene l'identificativo della connessione (e' un semplice numero). Potete stabilire piu' connessioni contemporaneamente.

Interrogare

Per recuperare delle informazioni dal database, in gergo si dice interrogare, basta usare il comando la funzione revDataFromQuery, specificando come separare righe e colonne:


put "SELECT * from utenti ; " into tSQL
put revDataFromQuery(tab,return,connID,tSQL) into tRecords




in questo caso abbiamo che tRecords contiene tutti i dati dove ogni colonna e' separata dall'altro dal carattere TAB e ogni riga da un accapo. Questa forma potete cambiarla, ma e' molto comoda perchè permette di visualizzare i dati un un campo di testo come una vera tabella (field, label).

Eseguire

Per eseguire dei comandi che modificano in database, basta usare il comando revExecuteSQL, ad esempio:


put "INSERT into users (name,surname) VALUES ('Jack','Sparrow')" into tSQL
revExecuteSQL connID,tSQL

Chiudere la connessione

Quando si lavora su database installati su server, tipo MySQL, conviene chiudere la connessione quando non si lavora più con il database, ecco il codice:
revCloseDatabase connID


mercoledì 18 giugno 2014

Il gioco dell'impiccato

Lo stack che potete scaricare da  http://livecodeshare.runrev.com/download/stack/69/Hangman è il classico gioco dell'impiccato.
E' un ottimo esempio di:
  • grafica personalizzata per i pulsanti
  • finestra senza la barra in alto
  • finestra della forma irregolare (guardate gli angoli in basso)
  • finestre che appaiono sfumando
Divertitevi a giocarci e poi ad esaminare il codice.

lunedì 16 giugno 2014

Lavorare con gli archivi ZIP

Livecode contiene il necessario per comprimere e decomprimere file con archivi ZIP.
Per comprimere un file o una cartella bisogna indicare il percorso assoluto dell'archivio zip che vogliamo creare:

revZipOpenArchive "C:/myarchive.zip", "write"



Poi bisogna indicare il percorso assoluto dei file che vogliamo mettere nel nostro archivio, e anche il percorso relativo dentro il nostro archivio:

revZipAddItemWithFile "C:/myarchive.zip", "test.txt", "C:/Programs/RunRev/test.txt"
revZipAddItemWithFile "C:/myarchive.zip", "folder1/test.txt", "C:/Programs/RunRev/test.txt"
revZipAddItemWithFile "C:/myarchive.zip", "temp/folder2/test.txt", "C:/Programs/RunRev/test.txt"



Una volta fatto ciò, ci basta chiudere l'archivio e il nostro file ZIP sarà creato definitivamente:

revZipCloseArchive "C:/myarchive.zip"


Se invece scompattare un archivio ZIP (unzip), dovete prima avere la lista dei file e poi creare le cartelle necessarie per scompattarlo, ecco il codice di un pulsante che chiede un file e lo scompatta sul desktop di Windows:


on mouseUp
   answer file "Scegli il file:"
   put it into myzip
   revZipOpenArchive myzip,"read"
   put revZipEnumerateItems(myzip) into tItems
   repeat for each line tline in tItems
      if last char of tline is "/" then
         create folder "C:/Documents and Settings/max/Desktop/" & tline
      else         
         put "C:/Documents and Settings/max/Desktop/" & tline into temp
         revZipExtractItemToFile myzip, tline, temp
      end if
   end repeat
   revZipCloseArchive myzip
end mouseUp

Potete adattare il codice precedente ad ogni esigenza.

mercoledì 4 giugno 2014

Nuovo indirizzo per il forum in inglese

Il forum in inglese di Livecode ha cambiato indirizzo, adesso è: http://forums.livecode.com/
Per fortuna sono rimasti tutti i vecchi post e impostazioni.

martedì 3 giugno 2014

Gioco del Sudoku

Lo script che potete scaricare da http://www.maxvessi.net/pmwiki/uploads/Site/Sudoku.zip vi permette di giocare al Sudoku, ma soprattutto di vedere come è realizzato un bel programma.
Questo programma ha sia le trasparenze, il trascinamento delle immagini e un algoritmo per la generazione ogni volta di un Sudoku diverso.
Ecco un'anteprima: