Painting Flash CS3: real time erase tool

Lunedì 11 Febbraio, 2008

Partendo dai codici forniti in Creare un'applicazione Paint in Flash CS3, ed eseguendo piccole modifiche, si può migliorare notevolmente lo strumento di "erase". Aggiungendo una Shape non visibile, è possibile usarla come "piano" per eseguire il draw() in modalità di fusione "erase". Come mostrato nell'esempio qui sotto, dopo aver disegnato qualcosa, tenete premuto il tasto Ctrl e l'effetto di "cancellazione" appare ora in tempo reale.

Loading Flash Player...

Il codice è il seguente - sorgente:

Actionscript:
  1. import flash.events.MouseEvent;
  2. import flash.display.BitmapData;
  3. import flash.display.Bitmap;
  4. import flash.display.GradientType;
  5. //
  6. import flash.geom.Matrix;
  7. //
  8. var md:Boolean = false;
  9. //
  10. var event_spr:Sprite = new Sprite();
  11. addChild (event_spr);
  12. //
  13. var area_width:Number = event_spr.stage.stageWidth;
  14. var area_height:Number = event_spr.stage.stageHeight-32;
  15. //
  16. var fillType:String = GradientType.LINEAR;
  17. var colors:Array = [0xFF0000, 0x00FF00, 0x0000ff];
  18. var alphas:Array = [1, 1, 1];
  19. var ratios:Array = [0, 128, 255];
  20. var spreadMethod:String = SpreadMethod.PAD;
  21. var matrix:Matrix = new Matrix();
  22. matrix.createGradientBox (area_width, area_height, 1, 0, 0);
  23. //
  24. with (event_spr.graphics) {
  25.     beginGradientFill (fillType,colors,alphas,ratios,matrix,spreadMethod);
  26.     drawRect (0,0,area_width, area_height);
  27.     endFill ();
  28. }
  29. // paint event
  30. event_spr.addEventListener (MouseEvent.MOUSE_DOWN, _onMouseDown);
  31. event_spr.addEventListener (MouseEvent.MOUSE_MOVE, _onMouseMove);
  32. event_spr.addEventListener (MouseEvent.MOUSE_UP, _onMouseUp);
  33. event_spr.addEventListener (MouseEvent.MOUSE_OUT, _onMouseUp);
  34. //
  35. var bmpd:BitmapData = new BitmapData(event_spr.width,event_spr.height,true,0);
  36. var bmp:Bitmap = new Bitmap(bmpd);
  37. addChild (bmp);
  38. //
  39. // shape temporanea
  40. var draw_shape:Shape = new Shape();
  41. addChild (draw_shape);
  42. //
  43. // shape, non visibile, usata per la "cancellazione"
  44. var erase_shape:Shape = new Shape();
  45.  
  46. //
  47. function _onMouseDown (e:MouseEvent):void {
  48.     debug ("_onMouseDown");
  49.     draw_shape.graphics.lineStyle (10, 0xffffff, 1);
  50.     erase_shape.graphics.lineStyle (20, 0xffffff, 1);
  51.     draw_shape.graphics.moveTo (e.localX,e.localY);
  52.     erase_shape.graphics.moveTo (e.localX,e.localY);
  53.     md = true;
  54. }
  55. //
  56. function _onMouseUp (e:MouseEvent):void {
  57.     md = false;
  58.     bmp.bitmapData.draw (draw_shape);
  59.     draw_shape.graphics.clear ();
  60.     erase_shape.graphics.clear ();
  61. }
  62. //
  63. function _onMouseMove (e:MouseEvent):void {
  64.     debug ("_onMouseMove");
  65.     if (md && !e.ctrlKey) {
  66.         draw_shape.graphics.lineTo (e.localX,e.localY);
  67.     } else if (md && e.ctrlKey) {
  68.         erase_shape.graphics.lineTo (e.localX,e.localY);
  69.         bmp.bitmapData.draw (erase_shape,null,null,"erase");
  70.     }
  71. }
  72. //
  73. function debug (v:String):void {
  74.     var d:Date = new Date();
  75.     trace (d.getMinutes()+":"+d.getSeconds()+":"+d.getMilliseconds()+": "+v);
  76. }

È stata aggiunta una nuova Shape, erase_shape, non visibile (non è stato effettuato nessun addChild()):

Actionscript:
  1. ...
  2. // shape, non visibile, usata per la "cancellazione"
  3. var erase_shape:Shape = new Shape();

Nella parte di codice che si preoccupa di disegnare è stato introdotto il controllo per il tasto Ctrl e, se premuto, viene interessata proprio la Shape erase_shape e copiata sulla Bitmap:

Actionscript:
  1. ....
  2. erase_shape.graphics.lineTo (e.localX,e.localY);
  3. bmp.bitmapData.draw (erase_shape,null,null,"erase");

Post correlati

Creare un’applicazione Paint in Flash CS3

Domenica 10 Febbraio, 2008

Come esposto in Actionscript Flash contest: erase tool non è possibile "cancellare" una particolare zona di uno Sprite, MovieClip o Shape su cui sono state tracciate linee o rettangoli tramite il puntatore graphics. Esiste, infatti, il solo metodo clear() che, tuttavia, ha effetto sull'intera area del nostro oggetto. La soluzione al problema risiede nella possibilità di usare gli oggetti Bitmap e BitmapData. Come vedremo possiamo accedere direttamente ai dati Bitmap e manipolarli in modo da "cancellare" i tratti con un vero e proprio strumento "cancellino".

Presenterò due metodi diversi per realizzare il "cancellino". Il primo "disegna" (cancella) i dati direttamente nella BitmapData, sfruttando il metodo fillRect() - si può usare anche setPixel() per esempio. Il secondo metodo, quello che preferisco, sfrutta i metodi di fusioni (blendMode).

Prima di tutto vediamo che tipo di organizzazione minimale è necessaria per realizzare un semplice Painter in Flash. Lo schema presentato qui sotto vale per entrambe le proposte del "cancellino":

schema-bitmap

Ho creato tre layer: il primo, MovieClip o Sprite, funziona da sfondo e gestore eventi (MouseDown, MouseMove e MouseUp). Il secondo, la Bitmap, è il nostro layer principale, quello che conterrà effettivamente la grafica disegnata e su cui sarà applicata la funzione "cancellino". Il terzo e ultimo layer, lo Shape, risolve due questioni: la prima è che permette di utilizzare direttamente le funzioni messe a disposizione dal puntatore graphics (come lineStyle, drawRect(), ecc...). Inoltre aumenta le performance durante il tracciamento grafico, come spiegato in dettaglio più sotto. Continua a leggere... »

Post correlati

Actionscript Flash contest: erase tool

Domenica 3 Febbraio, 2008

Premetto subito: non si vince nulla! A parte l'orgoglio - caso mai - di aver risolto il problema.

QUEST - DOMANDA

Come si realizza un tool per cancellare, eliminare, ripulire, una "porzione" della grafica disegnata con le API di Actionscript 3.0?

Con Actionscript 3.0 alcuni oggetti visivi, come i MovieClip o gli Shape, espongono la proprietà graphics, un puntatore ad un altro oggetto che "serve" tutte le funzioni grafiche di disegno runtime. Ad esempio è possibile sviluppare una semplice applicazione di disegno. Questo oggetto graphics permette di disegnare qualsiasi cosa, ad esempio su un oggetto Shape, in modo semplice e rapido. Il problema è che una volta disegnato qualcosa è possibile ripulire tutto ma non una singola parte.

Disegnare una linea è facilissimo:

Actionscript:
  1. var myShape:Shape = new Shape();
  2. addChild(myShape);
  3. //
  4. myShape.graphics.lineStyle(2,0xff0000,1);
  5. myShape.graphics.moveTo(0,0);
  6. myShape.graphics.lineTo(100,100);

Disegnato qualcosa è possibile ripulire tutto con la semplice chiamata al metodo clear():

Actionscript:
  1. myShape.graphics.clear();

Ma se voglio "cancellare" solo un punto? Oppure dalle coordinate 50,50 a 100,100?

Cercando su Internet ho trovato numerosi esempi di "applicazioni di disegno" e, in effetti, nessuna supporta o propone lo strumento "cancella".

Avete qualche soluzione?

Post correlati

10 motivi per passare ad Adobe Flash CS3

Lunedì 26 Novembre, 2007

2007-11-21_170314 Per alcuni sviluppatori basta sapere che esiste una nuova versione del loro pacchetto di sviluppo preferito per correre ad acquistare l'aggiornamento. Altri, e non a torto, mantengono una maggiore calma e "pretendono" di conoscere gli effettivi miglioramente della nuova versione prima di modificare le proprie abitudini. Nel caso di Adobe Flash CS3 non c'è molto da attendere, visto gli innumerevoli cambiamenti che ha subito il pacchetto da quando Macromedia è stata acquisita da Adobe.
Ecco, quindi, 10 semplici, ma importanti, motivi che, a mio personale parere, bastano per convincersi ad eseguire l'aggiornamento ad Adobe Flash CS3. Mi soffermerò, ovviamente, solo sulle caratteristiche che mi hanno colpito personalmente; questo non vuole essere un elenco esaustivo di tutte le numerose novità introdotte con la suite CS3, solo un volo radente per anticipare qualche features della versione CS3.

1. Installazione

L'installazione è gradevole e rapida, rispetto alle precedenti versioni. Si integra, tra l'altro, con tutti i prodotti Adobe (Dreamweaver CS3, Photoshop CS3 extended, ecc...) il che rende le operazioni di installazione/rimozione ed aggiornamento un vero piacere.

2. Compatibilità a ritroso

Una questione spesso sottovalutata, ma sempre tenuta in considerazione nella storia di Flash: la possibilità di gestire le precedenti versioni del prodotto. In Flash CS3 ci sono tutti gli strumenti sia per migrare che per manipolare le precedenti versioni dei nostri filmati. Troviamo questa possibilità sia nel debug (un debug separato per Actionscript 2.0 e Actionscript 3.0) sia in fase di compilazione del filmato. Scrivere da subito applicazioni Flash in Actionscript 3.0 potrebbe essere controproducente in determinati contesti. Se il vostro sito target ha un traffico notevole potrebbe capitare che molti utenti non hanno ancora installato le ultime versioni del Player Flash per il browser e quindi non vedrebbero il filmato. Tuttavia, come già detto, Flash CS3 permette di sviluppare applicazioni Flash mantendedo la compatibilità a ritroso e quindi non vedo in questo un grosso ostocalo nell'upgrade del prodotto.

3. Interfaccia grafica e IDE

Pannello ridotto ad icona Nuovo pannello Flash CS3 L'IDE di Flash CS3 (come quella di Dreamweaver CS3) è stata rivisitata al meglio. I pannelli (vedi figura qui a sinistra), spesso scomodi nelle precedenti versioni, sono stati completamente ridisegnati e adesso il loro uso è notevolemente meno invasivo. Pannelli in modalità icona Inoltre la possibilità di ridurre ad icona i pannelli (vedi figura qui a destra) è una vera trovata che rende l'interfaccia gradevole e funzionale. Quando un pannello si trova in modalità icona occupa molto meno spazio e con un semplice click è possibile aprire il pannello principale prima sempre visibile.
Tutta l'IDE, insomma, è stata rivista compresa la zona centrale con la finestra per l'editing grafico e del codice. Non vi segnalo tutti i cambiamenti altrimenti vi rovinerei la sorpresa...

Nuova IDE Flash CS3

Continua a leggere... »

Post correlati