Comme expliqué dans Flash Actionscript concours: l'outil d'effacement vous ne pouvez pas "effacer" une zone particulière d'un Sprite, MovieClip ou forme sur laquelle des lignes ou des rectangles ont été tirées à l'aide du curseur graphique. Il est, en fait, la seule méthode clear() , cependant, n'a aucun effet sur toute la surface de l'objet. La solution à ce problème réside dans la possibilité d'utiliser le bitmap et objets BitmapData. Comme nous le verrons, nous pouvons directement accéder et manipuler des données bitmap afin de "gommer" coups avec un instrument "effaceur" réel.
Présenter deux méthodes différentes pour atteindre la "porte". per esempio. Le premier "tirage" (supprimer) les données directement dans le BitmapData, en utilisant la méthode fillRect() - peut également être utilisé setPixel() par exemple. La seconde méthode, celle que je préfère, utilise les méthodes de fusions (blendMode).
Tout d'abord nous allons voir ce genre d'organisation est minimalement nécessaire pour atteindre un peintre Flash simple. Le schéma présenté ci-dessous s'applique à la fois les propositions de la «porte»:

J'ai créé trois couches: la première, MovieClip ou Sprite, le contexte et le travail du gestionnaire d'événement (MouseDown, MouseMove et MouseUp). Le second, le bitmap, il est de notre couches principales, celle qui sera effectivement établi graphiques seront appliquées et sur lequel la "porte". , ecc…). La troisième couche et la dernière, la forme, traite de deux questions: la première est qu'il permet d'utiliser directement les fonctions prévues par le curseur graphique (comme lineStyle , drawRect() , etc ...). Elle accroît également la performance au cours du tableau de suivi, comme expliqué en détail ci-dessous.
MÉTHODE 1 - L'accès direct aux données bitmap
) dalla Shape (layer 3) alla Bitmap (layer 2). Cette «échantillon» en utilisant la méthode fillRect() directement sur le BitmapData (couche 2) après que la conception a été copié (en utilisant la méthode draw() ) de Shape (couche 3) à Bitmap (couche 2).
Pour comprendre comment cela fonctionne ici est le même film avec la couche décomposée et pseudo-3D - élaboré à la case de couleur - Source :
Comme vous pouvez le voir vous dessinez sur la couche 3, la forme. Lorsque vous prenez l'événement MouseUp du contenu est copié à la forme bitmap (et donc les données sont dans BitmapData) et puis la forme est propre ( clear() ).
Remarque: ce dernier point, le clear() sur la forme, ne doit pas être sous-estimée. Quelques exemples du peintre en Flash (presque tous n'ont pas une véritable "porte") de dessiner directement sur un MovieClip, ou la forme, le maintien des données sur ce dernier établi. Après un certain temps "vous dessinez le système ralentit, que la zone« vecteur »de l'augmentation de MovieClip. Dans la méthode présentée par moi ce problème est résolu en ce que le vecteur de données de forme, quand ils sont copiés dans le bitmap sont tasformati en bits et la forme sera supprimé, libérant de la mémoire et le retourner à le flot de conception!
Maintenez la touche Ctrl (contrôle) est "supprimé" directement par le BitmapData fillRect() . Cela est possible parce fillRect() , comme les autres méthodes qui agissent sur BitmapData, vous permettent de définir la «couleur» par 0xARGB, où A est la valeur alpha, de la transparence.
Le code est comme suit: - Source :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | . MouseEvent ; flash.events importation. MouseEvent ; . BitmapData ; import flash.display. BitmapData ; . Bitmap ; import flash.display. bitmaps ; . GradientType ; . import flash.display GradientType ; / / . Matrix ; les importations flash.geom. Matrice ; / / Boolean = false ; MD var: booléen = false; / / Sprite = new Sprite ( ) ; var event_spr: Sprite = new Sprite (); event_spr ) ; addChild (event_spr); / / Number = event_spr . stage . stageWidth ; var area_width: Nombre = event_spr stages stageWidth;.. Number = event_spr . stage . stageHeight - 32 ; area_height var: Nombre .. = event_spr stages stageHeight - 32; / / String = GradientType . LINEAR ; fillType var: Chaîne = GradientType . linéaires; : Array = [ 0xFF0000 , 0x00FF00 , 0x0000ff ] ; couleurs var: tableau = [0xFF0000, 0x00FF00, 0x0000FF]; : Array = [ 1 , 1 , 1 ] ; var alphas: tableau = [1, 1, 1]; : Array = [ 0 , 128 , 255 ] ; ratios var: tableau = [0, 128, 255]; String = SpreadMethod . PAD ; spreadMethod var: Chaîne = SpreadMethod PAD;. : Matrix = new Matrix ( ) ; var matrice: Matrice = new Matrice (); createGradientBox ( area_width , area_height , 1 , 0 , 0 ) ; . createGradientBox matrice (area_width, area_height, 1, 0, 0); / / event_spr . graphics ) { avec (event_spr. graphiques) { fillType , colors , alphas , ratios , matrix , spreadMethod ) ; beginGradientFill (fillType, couleurs, alphas, ratios, matrice, spreadMethod); 0 , 0 , area_width , area_height ) ; drawRect (0, 0, area_width, area_height); ; endFill (); } / Événement / Peinture ( MouseEvent . MOUSE_DOWN , _onMouseDown ) ; . event_spr addEventListener ( MouseEvent MOUSE_DOWN, _onMouseDown.); ( MouseEvent . MOUSE_MOVE , _onMouseMove ) ; . event_spr addEventListener ( MouseEvent MOUSE_MOVE, _onMouseMove.); ( MouseEvent . MOUSE_UP , _onMouseUp ) ; . event_spr addEventListener ( MouseEvent MOUSE_UP, _onMouseUp.); ( MouseEvent . MOUSE_OUT , _onMouseUp ) ; . event_spr addEventListener ( MouseEvent MOUSE_OUT, _onMouseUp.); / / BitmapData = new BitmapData ( event_spr . width , event_spr . height , true , 0 ) ; var bmpd: BitmapData = new BitmapData (event_spr. la largeur, la hauteur event_spr, c'est vrai, 0.); Bitmap = new Bitmap ( bmpd ) ; var bmp: Bitmap = new Bitmap (bmpd); bmp ) ; addChild (bmp); / / Forme temporaire Shape = new Shape ( ) ; draw_shape var: Shape = new Shape (); draw_shape ) ; addChild (draw_shape); / / e : MouseEvent ) : void { Fonction _onMouseDown (e: MouseEvent ): void { ) ; debug ("_onMouseDown"); : uint = 0xffffff ; var c: uint = 0xFFFFFF; . lineStyle ( 10 , c , 1 ) ; .. draw_shape graphiques lineStyle (10, c, 1); . moveTo ( e . localX , e . localY ) ; .. draw_shape graphiques moveTo (et. localX et localY.); md = true; } / / e : MouseEvent ) : void { _onMouseUp function (e: MouseEvent ): void { md = false; . draw ( draw_shape ) ; .. bmp bitmapData tirage (draw_shape); . clear ( ) ; . draw_shape graphiques clairs ().; } / / e : MouseEvent ) : void { _onMouseMove function (e: MouseEvent ): void { ) ; debug ("_onMouseMove"); md && ! e . ctrlKey ) { if (MD & &! et. ctrlKey) { . lineTo ( e . localX , e . localY ) ; .. draw_shape graphiques lineTo (et. localX et localY.); ( md && e . ctrlKey ) { } Else if (MD & & et. CtrlKey) { . fillRect ( new Rectangle ( e . target . mouseX - 10 , e . target . mouseY - 10 , 20 , 20 ) , 0 ) ; .. bmp bitmapData fillRect (nouveau rectangle (cible et. mouseX - 10, et la cible mouseY - 10, 20, 20), 0...); } } / / v : String ) : void { debug fonction (v: cordes ): void { : Date = new Date ( ) ; var d: Date de = new Date de (); d . getMinutes ( ) + ":" + d . getSeconds ( ) + ":" + d . getMilliseconds ( ) + ": " + v ) ; trace (d. getMinutes () + "" + d. getSeconds () + "" + getMilliseconds d. () + "" + st); } |
Ligne 61, comme indiqué dans le code ci-dessus, court donc quand la touche Control est enfoncée. Comme vous pouvez voir cette section du code dessine directement dans le BitmapData avec un couleur 0, 0 × 0000!
MÉTHODE 2 - utilisation de mélanges
C'est probablement la meilleure méthode à utiliser quand il permet à toute sorte de "porte". Contrairement à la méthode précédente ne pas accéder directement aux données bitmap BitmapData actuelle, mais de profiter de l'assemblage (blendMode) et copier le bitmap en utilisant la méthode draw().
Version 3D - source de :
. Exactement de la même manière que nous copions les données de la forme bitmap, la "porte" est "simultanément" en copiant les données de la forme bitmap, mais cette fois, fixant les blendMode la méthode draw() pour erase .
Le code est comme suit: - Source :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | . MouseEvent ; flash.events importation. MouseEvent ; . BitmapData ; import flash.display. BitmapData ; . Bitmap ; import flash.display. bitmaps ; . GradientType ; . import flash.display GradientType ; / / . Matrix ; les importations flash.geom. Matrice ; / / Boolean = false ; MD var: booléen = false; / / Sprite = new Sprite ( ) ; var event_spr: Sprite = new Sprite (); event_spr ) ; addChild (event_spr); / / Number = event_spr . stage . stageWidth ; var area_width: Nombre = event_spr stages stageWidth;.. Number = event_spr . stage . stageHeight - 32 ; area_height var: Nombre .. = event_spr stages stageHeight - 32; / / String = GradientType . LINEAR ; fillType var: Chaîne = GradientType . linéaires; : Array = [ 0xFF0000 , 0x00FF00 , 0x0000ff ] ; couleurs var: tableau = [0xFF0000, 0x00FF00, 0x0000FF]; : Array = [ 1 , 1 , 1 ] ; var alphas: tableau = [1, 1, 1]; : Array = [ 0 , 128 , 255 ] ; ratios var: tableau = [0, 128, 255]; String = SpreadMethod . PAD ; var spreadMethod: Chaîne = SpreadMethod . PAD, : Matrix = new Matrix ( ) ; var matrice: Matrice = new Matrice (); createGradientBox ( area_width , area_height , 1 , 0 , 0 ) ; . createGradientBox matrice (area_width, area_height, 1, 0, 0); / / event_spr . graphics ) { avec (event_spr. graphiques) { fillType , colors , alphas , ratios , matrix , spreadMethod ) ; beginGradientFill (fillType, couleurs, alphas, ratios, matrice, spreadMethod); 0 , 0 , area_width , area_height ) ; drawRect (0, 0, area_width, area_height); ; endFill (); } / Événement / Peinture ( MouseEvent . MOUSE_DOWN , _onMouseDown ) ; . event_spr addEventListener ( MouseEvent MOUSE_DOWN, _onMouseDown.); ( MouseEvent . MOUSE_MOVE , _onMouseMove ) ; . event_spr addEventListener ( MouseEvent MOUSE_MOVE, _onMouseMove.); ( MouseEvent . MOUSE_UP , _onMouseUp ) ; . event_spr addEventListener ( MouseEvent MOUSE_UP, _onMouseUp.); ( MouseEvent . MOUSE_OUT , _onMouseUp ) ; . event_spr addEventListener ( MouseEvent MOUSE_OUT, _onMouseUp.); / / BitmapData = new BitmapData ( event_spr . width , event_spr . height , true , 0 ) ; var bmpd: BitmapData = new BitmapData (largeur event_spr., event_spr la hauteur, c'est vrai, 0.); Bitmap = new Bitmap ( bmpd ) ; var bmp: Bitmap = new Bitmap (bmpd); bmp ) ; addChild (bmp); / / Forme temporaire Shape = new Shape ( ) ; draw_shape var: Shape = new Shape (); draw_shape ) ; addChild (draw_shape); / / e : MouseEvent ) : void { Fonction _onMouseDown (e: MouseEvent ): void { ) ; debug ("_onMouseDown"); : uint = ( ! e . ctrlKey ? 0xffffff : 0x000000 ) ; var c: uint = (et ctrlKey 0xffffff: 0x000000!.?); . lineStyle ( 10 , c , 1 ) ; .. draw_shape graphiques lineStyle (10, c, 1); . moveTo ( e . localX , e . localY ) ; .. draw_shape graphiques moveTo (et. localX et localY.); md = true; } / / e : MouseEvent ) : void { _onMouseUp function (e: MouseEvent ): void { md = false; . draw ( draw_shape , null , null , ( e . ctrlKey ? "erase" : "normal" ) ) ; .. bmp bitmapData tirage (draw_shape, null, null, (et. ctrlKey "effacer" ou "normal")?); . clear ( ) ; . draw_shape graphiques clairs ().; } / / e : MouseEvent ) : void { _onMouseMove function (e: MouseEvent ): void { ) ; debug ("_onMouseMove"); md ) { if (MD) { . lineTo ( e . localX , e . localY ) ; .. draw_shape graphiques lineTo (et. localX et localY.); } } / / v : String ) : void { debug fonction (v: cordes ): void { : Date = new Date ( ) ; var d: Date de = new Date de (); d . getMinutes ( ) + ":" + d . getSeconds ( ) + ":" + d . getMilliseconds ( ) + ": " + v ) ; trace (d. getMinutes () + "" + d. getSeconds () + "" + getMilliseconds d. () + "" + st); } |
Ce code n'est pas très différent de l'année précédente. La vraie différence est dans la ligne 52! Cela détermine le "mode de fusion" lors de la copie du bitmap forme lorsque la touche Ctrl est enfoncée est utilisé le mélange erase .
C'est tout! Nous reviendrons dès que le bitmap et les différences entre les MovieClip, Sprite, Shape et objets Bitmap ... tous les visuels!










[...] Comment enregistrer des images dans les Balises Flash CS3: ActionScript 3.0, Bitmap, BitmapData, Flash CS3, GD, GD Library, Internet, PHP, Flash Enregistrer Image, Développement, Flash CS3 TutorialsCon l'utilisation de Bitmap est tellement améliorée que est immédiatement voulez créer une petite peinture. Nous avons déjà vu comment peindre un peu (voir Création d'une peinture € ™ application de Flash CS3 et peintre: application simple pour le dessin dans Flash Pro CS3) peut supporter une véritable «gomme» - fonction d'effacement, grâce à l'utilisation Shape et Bitmap couche particulière. Disons que Flash (contrairement à Flex), il ne permet pas l'encodage (tels que JPG ou PNG), il enregistre automatiquement les images bitmap. Cependant, vous pouvez la contourner en utilisant un script côté serveur et la possibilité d'envoyer des données dans Flash POST. [...]
[...] Créer une peinture de Flash CS3 [...]
Solution optimale, adaptée pour des solutions innnumerevoli également liée à l'application graphique Web.
@ John: Merci! Voir aussi peintre: application simple pour le dessin dans Flash Pro CS3