martedì 30 settembre 2014

Livecode Game Jam

Nei mesi di Ottobre e Novembre si terrà il primo Livecode Game Jam:
partecipare è semplice e gratuito, collegatevi al sito http://www.livecodegamejam.com/ ed inviate i vostri videogiochi fatti con Livecode. I più votati saranno... i più votati e famosi.
Per ora non ci sono premi, solo la notorietà e il divertimento nel vedere cosa si può fare con Livecode.

lunedì 29 settembre 2014

Colloquiare con una porta

Forse il titolo può sembrare equivoco, ma in questo post proverò ad esporre una panoramica su come leggere i dati che arrivano da una porta USB, seriale o perfino da una scheda Arduino.
Prima di cominciare è meglio capire a che serve tutto ciò?
Immaginiamo di avere a che fare con qualcosa che è oltre il semplice leggere e scrivere file, immaginiamo di  di dover sapere il valore di un sensore: di dover sapere quanto è stato ruotato il volante di un'auto, la temperatura di un termometro, l'intensità luminosa, ecc. In questo ambito dobbiamo leggere un input che ci può arrivare al computer in vari modi, nel modo più semplice è stato analizzato e digerito e ci arriva come una stringa di informazione sulla porta USB.
Collegando la porta USB ad sistema che legge i dati, come ad esempio Arduino, il nostro computer non vede quasi nulla, non c'è un file da leggere; c'è una porta di comunicazione che spara continuamente dati e che può anche accettare dei dati
Non entrerò nella programmazione di Arduino, che esula dalle intenzioni di questo post, inoltre esistono altri sensori con porta USB oltre ad Arduino; mi accennerò ad indicarvi http://bitlash.net/ come uno dei sistemi più semplici per programmarlo.
Il comando per colloquiare con una porta è open driver device, a seconda del sistema operativo la stringa device è diversa. Sui sistemi Windows tutte le porte sono COM, quindi si può scrivere:

open driver "COM2:" for binary update

mentre su Linux le porte sono le tty (o qualcosa di simile) dentro la cartella /dev, quindi:

open driver "/dev/tty2" for binary update

su Mac è un pelo più complicato, perchè nome e posizione cambia ad ogni versione, comunque per il resto è come su Linux:

# provare una di queste: /dev/cu.usbmodem2, /dev.tty.usbmodem2, /dev.cu.usbserial2,
open driver "/dev/cu.usbmodem2" for binary update


la modalità "for binary" (dialogo in binario)  è la più utilizzata, ma potete aprirlo anche in solo testo.
Ora viene la parte complicata, leggere e scrivere. E' complicata perchè dovete capire quando cominciano e finiscono i dati.
Se il vostro segnale è singolo canale (quindi ricevete le informazioni da un solo sensore), di solito il carattere di fine informazioni è un ritorno a capo. In questo caso basta: (sostituento usbSerial con il vostro device)

read from driver usbSerial for 1 line in 100 milliseconds
put it into theInput

Come vedete bisogna indicare un tempo massimo in cui il programma si mette ad ascoltare, altrimenti se c'è un errore di trasmissione il programma si blocca perchè non gli arriva mai la fine dei dati (il ritorno a capo).
Questo comando potete ripeterlo ogni 30 millisecondi per aggiornare il valore letto.
Se volete inviare un comando al vostro sensore/trasduttore, ad esempio "sono pronto a ricevere i dati", basta usare write, ecco il codice:

write "run lsd,500" & return to driver usbSerial

Se leggete da più sensori, nella porta USB arriverà un'informazione multicanale, del tipo:

a1=22
a2=34
a3=18
...

Qui le strade sono molte e dipende in gran parte dal tempo di aggiornamento di cui avete bisogno. Prendere tutte le righe insieme e poi analizzarle è la peggiore, rischiate di perdere moltissimo tempo per capire se avete ricevuto tutti i dati. Di solito la strategia migliore è leggere una riga alla volta, analizzarla e leggere la successiva.
Lo stesso discorso vale per la scrittura.
Un altro tipico errore è di voler subito voler comunicare a velocità altissime, fate delle prove e vedete se ne avete veramente bisogno. Di solito la velocità di base della porta (9600) è più che sufficiente per quasi tutte le applicazioni. Aumentare la velocità aumenta i problemi di sincronizzazione fra lettura e scrittura, il tempo a disposizioni diminuisce e non si riesce a capire se si hanno ricevuto tutti i dati correttamente.
Per impostare la velocità c'è questo comando:

set the serialControlString to "BAUD=9600 DATA=8 STOP=1 PARITY=N xon=off to=off dtr=off rts=off "


venerdì 26 settembre 2014

Livecode in Italia cresce

Con molto piacere vi annuncio che sono nate due nuove iniziative tutte italiane su Livecode:

questi siti sono gestiti dalla NEOL srl e hanno già realizzato un ottimo video esplicativo su Livecode in 60 secondi. Mi auguro che iniziative di questo tipo aumentino sempre di più! In modo da dimostrare che anche nel nostro paese riusciamo ad utilizzare linguaggi di programmazione di alto livello e non rimaniamo sempre fossilizzati in linguaggi di basso livello fortemente improduttivi.

giovedì 25 settembre 2014

Emulatore assembler

Ecco un programmino semplice che emula il linguaggio assembler x86. Scritto da Andrè Garcia, è un progetto simpatico su cui potete mettere mano:
Ha perfino un monito su cui potete vedere il risultato. Lo potete scarica da qui: http://tinyurl.com/p48nhwd
Ha quattro registri: ax, bx, cx, dx. Ecco una serie di comandi che accetta:
  • GET - chiede un numero
  • PUT - motra il contenuto del registro ax 
  • MOV - copia il contenuto al registro target:
    • MOV <target>, <register>
    • MOV <target>, <number>
  • CMP - confronta i registri
  • JA - salta, se maggiore
  • JB - salta, se minore
  • JAE - salta se uguale o maggiore
  • JBE - salta se uguale o minore
  • JNA - salta se non più grande 
  • JNB - salta, se non più piccolo
  • JE - salta, se uguale
  • JNE - salta, se non uguale
  • JMP - salta!
  • XCHG - scambia due registri
  • ADD - somma
  • SUB - sottrae
  • AND - bitwise and
  • OR - bitwise or
  • XOR - exclusive or
  • CALL - chiama una subroutine
  • RET - ritorna da una subroutine
  • HALT - ferma il programma
  • SETE - set 1/0 if equal
  • SETNE - set 1/0 if not equal
  • SETLE - set 1/0 if lower or equal
  • SETL - set 1/0 if lower
  • SETG - set 1/0 if greater
  • SETGE - set 1/0 if greater or equal
  • SETNLE - set 1/0 if not lower or equal
  • SETNL - set 1/0 if not lower
  • SETNGE - set 1/0 if not greater or equal
  • SETNG - set 1/0 if not greater


mercoledì 24 settembre 2014

Arrotondare i numeri

Oggi trattiamo un argomento che si può applicare nei più svariati ambiti, perfino nel calcolare le pagine di stampa di un documento: come arrotondare i numeri.
Livecode mette a disposizione le sola funzioni round() e trunc() per tale operazione, ma bisogna sapere come applicarla.
Facciamo degli esempi per vedere come sfruttarla al massimo. Il primo sarà semplicemente arrotondare qualunque numero all'intero più vicino:

put round(2.4) # il risultato è 2
put round(2.6) # il risultato è 3


adesso proviamo ad arrotondare alla prima cifra decimale:

put round(2.712, 1) # il risultato è 2.7
put round(2.765, 1) # il risultato è 2.8


se vogliamo solo la parte intera di un numero (troncare), basta:

put trunc(2.712) # il risultato è 2


Ora viene la parte difficile, certe volte ci serve di arrotondare al numero intero superiore (ceiling o parte intera superiore), esempio 2.1 che diventi 3. Per fare questo bisogna scrivere la seguente funzione:

function ceiling pNumber
    if pNumber < zero or pNumber is an integer then      
       return trunc(pNumber)
    else      
       return trunc(pNumber) + 1
    end if
end ceiling

a questo punto la funzione è pronta:

put ceiling(2.1) # il risultato è 3

Un'altra possibilità della funzione round() è di poter ottenere numeri interi arrotondando ai decimali, centinaia e così via. Per fare questo bisogna utilizzare i numeri negativi come precisione dell'arrotondamento, esempio:

put round(1234, -1) # il risultato è 1220
put round(1236, -1) # il risultato è 1230
put round(1236, -2) # il risultato è 1200
put round(1236, -3) # il risultato è 1000


Per finire questa panoramica vi mostro statRound() che è una funzione simile a round(), ma solo per fini statistiche; quindi usatela solo sapete bene cosa vi può uscire come risultato. Ecco alcuni esempi:

put statRound(2.5) # il risultato è 2, perchè 2 è pari (arrotonda in difetto)
put statRound(3.5) # il risultato è 4, perchè 3 è dispari (arrotonda in eccesso)
put statRound(22.753, 2) # il risultato è 22.75
put statRound(723.2, -1) # il risultato è 720

martedì 23 settembre 2014

Barra dei menù

La barra dei menù è la barra in alto che permette di accedere alle funzioni classiche di un programma: File, Modifica, Aiuto, ecc.
Livecode ha uno strumento integrato per poterli creare da zero con poche facili operazioni, che andremo a vedere.
Prima di iniziare chiariamo subito che non ci sono differenze tra Mac e gli altri sistemi operativi, Livecode si occupa di sistemare tutto. Su Mac, a differenza degli altri sistemi operativi, la barra del menu di una finestra non deve essere sulla finestra, ma apparire sulla barra del monitor. Usando livecode possiamo fare la barra del menu su ogni finestra e se il programma gira sul Mac, sarà Livecode a spostare la finestra più su fino a nascondere la barra  e a farla apparire sulla barra del monitor del Mac. Ecco un esempio chiarificatore:
Programma normale

Programma su Mac
Il sistema di coordinare non cambia, quindi non arrovellatevi sul fatto che il programma giri su Mac o su un altro sistema operativo: con Livecode è uguale.
Per costruire un menu basta andare su Tool -> Menu Builder:
Qui sulla colonna sinistra vedete le voci principali, mentre in quella di destra le sottovoci per ogni voce.
Dal menu builder potete aggiungere tutta una serie di effetti semplicemente usando il mouse, e le modifiche appariranno nel nome con un codice. Ecco la lista dei caratteri speciali e il loro significato:
  • -   il trattino semplice indica  la linea di divisione
  • !c il punto esclamativo e la lettera c indica che ci sarà il simbolo di spunta davanti alla voce
  • !n leva il check alla voce
  • !r mette il pallino alla voce
  • !u rimuove il pallino
  • & mette la lettere speciale
  • / mette la scorciatoia da tastiera
  • ( rende il menu disabilitato
  • TAB il carattere TAB permette di aggiungere dei sottomenu. Potete annidarne quanti ne volete uno dentro l'altro.
 Per esempio il seguente listato:
produce il seguente menù:

I tag sono argomenti opzionali che possono servire per dividere quello che appare nel comando rispetto al suo vero nome. Ad esempio una riga di menù definita così:  

Incolla/V|Paste

Paste è il tag e sarà passato nel codice dello script (senza tag sarebbe passato Incolla), il resto serve per la grafica e può cambiare a seconda della lingua.

Ultima nota, quando indicate le scorciatoie usate sempre CMD per il tasto Control, Livecode lo cambierà in Control sui sistemi non Mac




venerdì 19 settembre 2014

Link nei PDF

Oggi vediamo come poter fare dei link cliccabili nei PDF senza bisogno di estensioni aggiuntive. Con Livecode basta aggiungere, quando si crea il PDF, il comando print link.
Come esempio facciamo i seguenti passaggi:
  • creiamo una finestra bianca (il bianco è più bello da stampare) 
  • con una scritta che riporta un link, basta andare su Text-> Link e automaticamente cambia la scritta con l'effetto grafico di un link. Chiamatela "esempio".
  • un bottone "Crea PDF"
Più o meno dovreste avere questo risultato:




Ora nel codice del pulsante scrivete:

on mouseUp
   set the printPaperSize to (item 3 to 4 of the rect of this stack)
   put the rect of field "esempio" into temp
   ask file "Save PDF as:" with "Esempio.pdf"   
   if it is empty then
      exit mouseUp
   end if
   open printing to PDF it   
   print card 1 of this stack   
   print link to URL "http://www.paypal.com/" with rect temp
   close printing
end mouseUp

Notare come indichiamo l'area della pagina cliccabile, quando creiamo un link PDF.
Se tutto è andato bene, avrete un risultato come questo:


giovedì 18 settembre 2014

Quartam PDF

Oggi parliamo di un'estensione per Livecode: Quartam PDF 1.1.5.
Questo componente aggiuntivo è disponibile sia in versione gratuita open source che in versione commerciale; le due versioni sono identiche. L'unica differenza è che se volete utilizzare Quartam PDF per applicazioni commerciali non open source, dovete acquisire la licenza. Il costo della licenza è di $ 150, la licenza non ha una scadenza.
Attenzione che sul sito Livecode troverete ancora la versione 1.0.0 che non è open.
Livecode possiede già di per sè la possibilità di creare PDF, ma questa estensione rende tutta una serie di operazioni molto più semplice.
Una volta avviato avrete a disposizioni tutta una serie di funzioni che sono descritte nel suo apposito vocabolario/guida:



Andiamo con ordine e vediamo un riassunto di cosa offre:

Compatibilità :
  • Compatibile con tutte le versioni di Livecode
  • Non necessita di librerie esterne
Precisione e sceltà delle unità di misura:
  • Punti, millimetri o pollici.
  • Possiede funzioni per convertire da un'unità ad un'altra.
Controllo totale della pagina:
  • Ha già in memoria le misure standard dei seguenti formati A0 - A10, B0 - B10, C0 - C10, RA0 - RA4, SRA0 - SRA4, Executive, Folio, Legal, Letter.
  • Potete scegliere qualsiasi formato.
  • Nello stesso documento potete avere le pagine con rotazioni differenti
  • Possibilità di inserire pagine nei documenti (ideale per inserire indici e bookmarks)
Supporto agli elementi grafici:
  • Linee, rettangoli, rettangoli con angoli arrotondati, ovali, poligono irregolari e regolari, curve di bezier.
  • Spessori delle linee, estremità, unioni, tratteggi, ecc.
  • Trasformazioni: scala, trasla, ruota, deforma, specchio
  • Trasparenze ed effetti.
  • Gradienti.
  • Ritagli.
  • Inserimento di immagini EPS (sperimentale).
Inserimento immagini JPG e PNG
Testo e paragrafi:
  • Possibilità di scrivere in rettangoli, aree o tabelle.
  • Creazione automatica di nuove pagine quando si scrivono nuvi testi più grandi della pagina.
  • Allineamento testo:sinistro, destro, centrato, giustificato.
  • Adattamento del testo o ritaglio.
Modifiche avanzate:
  • Inserimento di metadati: autore, creatore, parole chiave, soggetto, titolo.
  • Impostazione dello zoom e layout all'apertura.
  • Inserimento bookmark e link.
  • Intestazioni e piè di pagina.

mercoledì 17 settembre 2014

Entry point

Oggi continuiamo a vedere come andare a caccia di errori nei nostri programmi (in gergo debug), vedendo un altro strumento utile, gli entry point.
Quando scriviamo il codice, molte volte non possiamo avviare tutto il programma per vedere se una particolare funzione o messaggio (handler) si comporta senza problemi; per questo motivo è possibile avviare un entrypoint, cioè testare un handler o una funzione indicando anche i parametri.
Vediamo nella pratica in cosa consiste: scriviamo il seguente codice:


on miotest temp, temp2, var3
   put temp
end miotest

è un messaggio (handler) con tre parametri.
Ora andiamo su Debug -> Entry point e vi apparirà la seguente finestra:
Nella finestra potete scegliere il messaggio e i parametri da inserire. Ora ogni volta che cliccherete sulla freccia verde nell'editor, questo messaggio verrà attivato con i parametri indicati:



martedì 16 settembre 2014

Variable watch

Nel post di ieri abbiamo visto i breakpoint per trovare gli errore nei nostri programmi, oggi faremo la conoscenza dei variable watch breakpoint.
Questo nuovo tipo di interruzione del programma, invece di agire su una particolare linea del codice, enra in atto quando una variabile cambia valore. Per inserire un variable watch breakpoint basta andare su Debug -> Add Variable Watch, e vi apparirà una finestra come questa:
Come vedete è del tutto analogo al sistema dei breakpoint, come handler possiamo indicare anche Global Scope che sta ad indicare "ovunque".
Questo tipo di breakpoint ci aiuta a scovare gli errori anche quando non sappiamo dove si attivino, ci basta indicare le variabili sospette e vedremo in un attimo dove il nostro codice sbaglia.
Come al solito potete imporre delle condizioni per l'attivazione del breakpoint e li troverete sempre nella lista dei breakpoint nella linguetta breakpoint, ma saranno indicati da una lente di ingrandimento, invece del pallino rosso.

lunedì 15 settembre 2014

Breakpoint

Livecode permette di vedere immediatamente come funziona il programma, ma non è l'unico sistema di debug (caccia degli errori di programmazione) che ha a disposizione. Oggi esamineremo i breakpoint.
Per sfruttare appieno la modalità di debug, conviene attivare la modalità debug andando su Debug -> Script Debug Mode:


Cominciamo a conoscere i breakpoint: servono a fermare il codice del programma nel punto indicato ed esaminare cosa succede. Il programma si ferma alla riga prima del breakpoint, e la riga del breakpoint non è eseguita. Per inserirli e levarli potete cliccare accanto ad un qualunque numero di riga del codice, oppure premendo F9,e un pallino rosso apparirà accanto alla riga:
Se il pallino non è rosso, allora non siete in modalità debug.
Quando salvate i vostri programmi, i breakpoint sono salvati nel file, e li ritroverete quando riaprirete il programma. Per tenerli attivi o disattivarli basta entrare o uscire dalla modalità debug.
Se volete cancellare tutti i breakpoint presenti, basta andare su Debug -> Clear all breakpoints.


Una volta che il programma è bloccato, potete vedere i valori delle variabili nella linguetta Variables:
I valori preceduti dal simbolo del dollaro ($) sono variabili di sistema. Sempre in questa linguetta potete cambiare i valori delle variabili.
Quando il programma è bloccato, potete usare il terminale di Livecode per aggiungere variabili altre variabili al programma.
In alcuni casi ci serve capire quando è stata chiamata la riga in cui abbiamo messo il breakpoint; per esempio può essere dentro un messaggio chiamato da più elementi. Proprio per questo motivo in altro c'è l'indicatore del contesto in cui è stata chiamata la nostra riga.

La lista dei breakpoint è nella linguetta breakpoint:

Dalla lista cliccando sulla matita, o cliccando col destro sul pallino colorato nel codice, è possibile mettere delle condizioni per attivarlo (conditional breakpoint). Potete inserire qualunque condizione (come in una IF) nel campo condizione:

Dal tasto destro

Dalla linguetta Breakpoints
Quando il programma è fermo potete utilizzare i pulsanti di avanzamento a seconda delle vostre necessità, la spiegazione è nell'immagine successiva, cliccate sull'immagine per ingrandirla:

venerdì 12 settembre 2014

Novità dalla conferenza mondiale 2014

Come sapete dal 2 al 5 Settembre si è tenuta la conferenza mondiale su Livecode a San Diego.
In questo post vi riassumerò cosa è stato presentato.
Cominciamo con la presentazione del CEO della RunRev che ha presentato lo stato attuale e gli sviluppi futuri di Livecode.
Prima di tutti ha voluto sottolineare che le linee di codice di Livecode 6 sono circa pari a 6 libri del signore degli anelli:
e lo stanno riscrivendo per renderlo più agile con un codice più recente.
I risultati già li conoscete da questo post: http://livecodeitalia.blogspot.it/2014/07/nuove-versioni-di-test-67-e-70.html
e sono stati elencati con questa slide:
Il numero di bug segnalati e risolti è stato impressionante nell'ultimo anno :

Tutto questo sta portando ad una nuova versione, molto più moderna e con molte funzionalità in più: Livecode 8
sono state mostrate tutta una serie di esempi funzionanti.

Prima di tutto sarà possibile creare dei widget completamente nuovi: fino ad esso se vi inventate un widget, non è altro che l'insieme di elementi già presenti in Livecode (bottoni, menu, tabelle); dalla versione 8 sarà possibile scrivere widget da zero. Per creare questi nuovi widget ci sarà un editor a parte specifico.

Sono già stati realizzati dei nuovi elementi (o widget) come i seguenti:

E' stato mostrato come creare dei nuovi widget, e il codice da scrivere è semplicissimo!

Non è finita qui, la cosa più sorprendente è la possibilità di incorporare il codice sorgente di altri linguaggi di programmazione! Potete inserire nei programmi Livecode anche codice proveniente da Java/Javascript, C/C++, qualsiasi cosa. Il tutto è stato mostrato in diretta in una versione prototipo di Livecode 8 per Mac che girava perfettamente. Anche in questo caso incorporare il codice di altri linguaggi è semplicissimo.
Ecco una slide che spiega  la nuova struttura di Livecode 8:

L'obbiettivo del 2015 è di far diventare Livecode uno dei 10 linguaggi più conosciuti. Livecode 8 probabilmente sarà rilasciato verso Marzo 2015.

mercoledì 10 settembre 2014

Cerca e sostituisci

Uno strumento sottovaluto dell'editor di Livecode è il sistema "cerca e sostituisci". Per aprire la finestra basta andare su "Edit -> Find & Replace":



oppure potete utilizzare la scorciatoia Ctrl+Shift+F.



Dalla finestra che vi appare potete cercare e sostituire qualunque cosa nel vostro codice ovunque esso si trovi.

Cercare è importante per capire dove abbiamo scritto qualcosa che, per esempio, porta ad un errore oppure per esaminare il codice scritto da altro programmatore.
Prima di tutto notiamo che per ricercare bisogna aver salvato. La ricerca avviene solo sul file scritto.
La finestra di ricerca permette di specificare la ricerca con:
  • testo semplice (i caratteri speciali non sono interpretati, ma considerati come semplici caratteri)
  • caratteri jolly (come l'asterisco)
  • espressioni regolari
  • considerare o ignorare se i caratteri sono maiuscoli o minuscoli
  • considerare una alla volta le parole digitate nel campo cerca o solo tutte insieme
la ricerca vi elenca i risultati ovunque essi si trovino:



cliccando su uno dei risultati, verrete trasportati direttamente alla riga di codice dove si trova, anche dovendo aprire un'altra finestra se necessario.
Se volete limitare la ricerca ad una porzione del vostro programma, potete selezionare dal menu a tendina dove limitare la ricerca (stack, card, button, codice corrente aperto, ecc.)

L'altra  funzione sorprendente di Livecode è quella di sostituzione. Come in tutti gli editor permette  di sostituire il testo trovato con un altro, sia una volta sola che per tutte le ricorrenze trovate. Allora cosa c'è di tanto sorprendente? Il formato del file Livecode è tale da poter contenere tutto il codice in unico file: pulsanti, bottoni, immagini; quindi potete cambiare il nome ad una variabile, un messaggio, una funzione o qualunque cosa in tutto il programma con un semplice click, senza aver paura di aver dimenticato qualcosa da qualche parte. Per chi, come il sottoscritto, erra abituato a vari piccoli file sparsi in varie cartelle, questo è qualcosa di sorprendente.

venerdì 5 settembre 2014

Livecode per Raspberry PI e 64bit

E' stata rilasciata la versione 7.0 RC1 di livecode, questa nuova versione ha anche il supporto a 64bit per linux e per Raspberry PI (il computer completo che sta in una mano).  Come al solito, tutto si può scaricare da: http://downloads.livecode.com/livecode/
Penso che oggi il miglior linguaggio di programmazione per sia proprio Livecode, è l'unico così completo e veloce.
Questa è solo la punta dell'iceberg, durante la riunione a San Diego in questi giorni, sono trapelate anticipazioni per gli sviluppi nei prossimi mesi che vi lasceranno a bocca aperta!

giovedì 4 settembre 2014

Interagire con il cloud

I servizi di cloud sono servizi dove i dati sono distribuiti su più computer. Tipicamente sono servizi basati su database, come Amazon AWS.
Esiste un servizio cloud anche per Livecode, lo potete provare gratuitamente qui: http://livecloud.io/

E' basato su NoSQL, quindi segue l'ultima moda in fatto di database.
Non è un servizio inventato dai creatori di Livecode, ma da un'altra società informatica.

Al momento è gratuito e in fase beta, i vantaggi è che si integra facilmente in un linguaggio di programmazione semplice come livecode. Sono sicuro che verrà migliorato notevolmente, ma per chi cerca di avvicinarsi al cloud, può essere un'ottima occasione.

Qui trovate una guida: http://livecloud.io/livecloud-documentation/

Ecco un video esplicativo.

mercoledì 3 settembre 2014

Gestire il multitouch

Quando si ha a che fare con i dispositivi touch, come cellulari e tablet, è utile saper gestire il tocco di due o più dita contemporaneamente. Molti programmi, infatti, risultano più semplici da usare con il tocco di più dita, come ad esempio gli effetti di zoom.
Livecode ha incorporato anche un sistema per gestire il multitouch senza limite al numero di dita da poter utilizzare contemporaneamente. Questo sistema funziona su Android e iOS.
I messaggi da intercettare sono: touchStart, touchMove e touchEnd.
Per ognuno di essi abbiamo a disposizione un identificatore unico (tID) del dito a contatto con lo schermo, che è rappresentato da un numero.
  • touchStart è inviato appena un dito tocca lo schermo
  • touchMove è inviato quando un dito scorre sullo schermo, fornisce anche la posizione (X,Y) del dito
  • touchEnd è inviato appena un dito si stacca dallo schermo
Ad esempio il seguente codice fornisce la posizione, istante per istante, delle dita sullo schermo e crea dei pallini dove si trovano le dita:

on touchstart tID
   lock screen
   create field ("dito" & tID)
   set the width of the field ("dito" & tID) to 250
   put "1," & (22 * tID) into temp #posizione
   set the topleft of the field ("dito" & tID) to temp
   create graphic ("dito" & tID)
   set the opaque of graphic ("dito" & tID) to True
   set the style of graphic ("dito" & tID) to oval
   put (25 * tID) & comma & (25 * tID) & comma & (25 * tID) into temp #colore
   set the backgroundcolor of graphic ("dito" & tID) to temp
   set the width of graphic ("dito" & tID) to 30
   set the height of graphic ("dito" & tID) to 30
   unlock screen
end touchstart

on touchend tID
   delete field ("dito" & tID)
   delete graphic ("dito" & tID)
end touchend

on touchmove tID, tX, tY
   set the text of field ("dito" & tID) to ("il dito " & tID & " si trova in " & tX & comma & tY)
   set the loc of graphic ("dito" & tID) to (tX & comma & tY)
end touchmove

Ed ecco il risultato su un cellulare Android:

martedì 2 settembre 2014

Creare immagini PMB

C'è un programmatore che si era comprato un orologio per allenarsi della Polar. Questi orologi hanno un software che permette di caricare immagini e animazioni personalizzate:
Il problema è che le immagini devono essere in formato PMB, un formato di file particolare che ha solo il bianco e nero ed è un semplice testo. Ogni riga del file di testo PMB è solo un numero che convertito in binario fornisce quali pixel sono neri e quali bianco di una colonna.
Per fortuna il nostro programmatore, conoscendo Livecode, ha creato il codice per convertire qualunque immagine in PMB; ecco il codice:

on mouseUp   
   put the imagedata of the last image into iData
   put the width of the last image into w
   put the height of the last image into h   
   put "[BitmapInfo2]" & return & w & return & h & return into fld 1   
   repeat with column = 1 to w
      put empty into theBinary
      repeat with row = 1 to h
         put (row-1) * w + column into thePixel
         if charToNum ( char ( 4 * (thePixel - 1 ) + 2 ) of iData ) > 0 then
            put 0 after theBinary
         else
            put 1 after theBinary
         end if
      end repeat      
      put baseconvert (theBinary,2,10) & return after fld 1
   end repeat


In questo modo è possibile personalizzare gli orologi della Polar con qualunque immagine. Ecco un esempio con il logo della RunRev (la casa proprietaria di Livecode):

lunedì 1 settembre 2014

Ridimensionare le immagini

Oggi vedremo come creare un programma che legge un'immagine, la ridimensiona e la salva ridimensionata.
Creiamo un nuovo stack e mettiamoci un bottone per chiedere dove si trova il file dell'immagine che vogliamo. Livecode può importare come immagini  i seguenti formati: GIF, JPEG, PNG, BMP, XWD, XBM, XPM, PBM, PGM, PPM, PICT, EPS.
Per non appesantire troppo il codice mi limito ai formati più comuni, quindi il codice del pulsante sarà:

on mouseUp
   if there is an image 1 then
      delete the last image
   end if
   answer file "Seleziona l'immagine"
   put it into temp
   set itemdel to "."      
   if the last item of tolower(temp) is not among the items of "jpg.gif.png.jpeg.bmp" then
      answer "Il file selezionato non è un'immagine"
      exit MouseUp
   end if   
   import paint from file temp
   set the top of the last image to 75
   set the resizeQuality of last image to "best"
   set the inw of the last image to the width of the last image
   set the inh of the last image to the height of the last image
   set the intl of the last image to the topleft of the last image
end mouseUp

Andiamo a spiegarlo:
  • cancelliamo un eventuale immagine già presente
  • chiediamo la posizione del file
  • controlliamo che l'estensione del file sia una di quelle che ci piacciono
  • importiamo l'immagine, questa operazione crea una nuova immagine
  • la spostiamo in modo che non copra il pulsante
  • impostiamo la qualità per la modifica delle immagini su best (migliore)
  • salviamo le larghezza, altezza e posizione iniziali
Poi mettiamo uno scrollbar che chiameremo scala, e un pulsante per salvare. Se tutto  è andato bene, avremo qualcosa di simile a questo:

Il codice dello scrollbar sarà:

on scrollbarDrag newPosition
   put the inw of the last image into iniW
   put the inH of the last image into iniH
   put the inTl of the last image into iniTl
   set the width of the last image to round(iniW * newPosition / 100)
   set the height of the last image to round(iniH * newPosition / 100)
   set the topleft of the last image to iniTl
end scrollbarDrag

Come vedete riprendiamo i dati salvati e li usiamo come riferimento per scalare l'immagine quando moviamo l'indice dello scrollbar.

Ora manca il codice del pulsante Salva:

on mouseUp
   ask file "Fornire il nome del nuovo file:"
   export last image to file it as JPEG
end mouseUp



Il messaggio export supporta i seguenti formati di immagine: PBM, JPEG, GIF, BMP, PNG .

 Potete divertirvi a creare un programma che scala tutte le immagini in una cartella in automatico o creare qualche gioco che sfrutta gli effetti di ingrandimento o riduzione della dimensione delle immagini.