PROLOGOApro questo thread per spiegare come funzionano gli effetti di transizione di Hollywood, la loro gestione e successivamente illustrerò una mia libreria che ho implementato per semplificare la gestione degli effetti in maniera asincrona.
GLI EFFETTI DI TRANSIZIONEPer effetto di transizione si intende un effetto speciale con il quale una data immagine viene mostrata sullo schermo.
Hollywood è nato principalmente come strumento per realizzare delle presentazioni interattive e solo successivamente è stato sviluppato come linguaggio vero e proprio orientato al multimedia, è per questo che risulta essere molto potente in questo settore, perchè è nato proprio per fare ciò.
Come ho anticipato è possibile mostrare a video una determinata immagine con un effetto di transizione, come ad esempio una dissolvenza. Con questo metodo è possibile mostrare dei Brush, dei Layer, degli oggetti testuali o delle immagini di sfondo (Backdrop).
Adesso non starò qui ad illustrare tutti i comandi disponibili ma solo un paio, i più comuni, ossia i Brush e i Layer e le meccaniche di funzionamento.
Per mostrare un brush utilizzando un effetto di transizione si utilizza il comando:
DisplayBrushFX(brush_id, x, y, parameters)
Dove:
-
brush_id -> id del brush creato o caricato
-
x,
y -> coordinate dove mostrare il brush
-
parameters -> tabella contenente ulteriori parametri legati all'effetto da utilizzare
I campi supportati nella tabella <parameters> sono:
-
type -> effetto da utilizzare per la transizione (ad esempio: #CROSSFADE, #DIAGONAL, #ROLLTOP, ecc...)
-
speed -> velocità dell'effetto (può essere un numero oppure una costante predefinita tipo: #NORMALSPEED, #FASTSPEED, ...)ù
-
parameter -> parametro addizionale richiesto da alcuni effetti particolari
-
async -> flag che permette di eseguire transizioni asincrone (default False)
Questo semplice pezzettino di codice mostrerà come eseguire una transizione con un brush mostrandolo al centro dello schermo:
...
Local mybrush = LoadBrush(Nil, "testimage.jpg")
DisplayBrushFX(mybrush, #CENTER, #CENTER, { type = #CROSSFADE })
Print("Done!")
...
In pratica viene caricato un brush e mostrato a video con l'effetto crossfade, al termine della transizione verrà stampato il testo "Done!".
Come si vede è molto semplice gestire le transizioni ma anche molto limitante perchè
in questo modo è possibile eseguire una sola transizione alla volta.
Se ad esempio dovessi mostrare più brush o layer contemporaneamente ed eventualmente con effetti differenti per ognuno di essi sarà indispensabile gestire manualmente le transizioni in maniera asincrona, questo è possibile impostando il flag
async = True nella tabella
parameters vista poco più su.
EFFETTI DI TRANSIZIONE ASINCRONIModificando il minuscolo esempio che abbiamo fatto per una gestione asincrona avremo il seguente codice:
...
Local mybrush = LoadBrush(Nil, "testimage.jpg")
Local fx_id = DisplayBrushFX(mybrush, #CENTER, #CENTER, { type = #CROSSFADE, async = True })
Print("Done!")
While Not(ASyncDrawFrame(fx_id))
Wait(50, #MILLISECONDS)
Wend
Print("Transition done!")
...
Quando si utilizza la transizione asincrona la funzione che determina l'effetto (in questo caso
DisplayBrushFX) restituisce sempre un id di riferimento all'effetto in modo da permetterci di referenziare la transizione per poterla aggiornare (
ASyncDrawFrame), terminare (
FinishASyncDraw) oppure interrompere (
CancelASynDraw).
E' chiaro che nel loop While...Wend stiamo gestendo manualmente la transizione, frame dopo frame con un'attesa di 50 millisecondi fra ogni aggiornamento.
Il comando
ASyncDrawFrame() resituisce True se non ci sono altri frame da disegnare altrimenti restituisce False.
L'esempio è molto spartano ma permette di capire il meccanismo, con questa tecnica è possibile utilizzare delle routine di aggiornamento temporizzate con estrema semplicità che possono gestire tutte le transizioni asincrone che vogliamo in maniera efficiente.
Per concludere questa prima panoramica aggiungo che attraverso il comando ASyncDrawFrame() è possibile richiedere uno specifico frame da visualizzare, è quindi possibile avere il controllo totale della transizione mostrando i frame con la sequenza desiderata.