Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ластик (http://www.flasher.ru/forum/showthread.php?t=165469)

allanon85 23.08.2011 13:42

ластик
 
Подскажите как реализовать ластик. Не прямоугольной формы. Допустим круг.

Единственное что пришло в голову, это взять координаты всех пикселей ластика и на картинке найти пиксели по этим координатам, затем провести с ними необходимые манипуляции.

Может есть другой способ?

silin 23.08.2011 14:25

можно поиграться с blendMode ластика и отрисовкой результата в битмап
Код AS3:

package 
{
        import flash.display.*;
        import flash.events.*;
 
        public class Main extends Sprite
        {
                private var bmd:BitmapData = new BitmapData(400, 200, false, 0x8080C0);
                private var brush:Sprite = new Sprite();
                public function Main():void
                {
 
                        brush.graphics.beginFill(0xC0C0C0);
                        brush.graphics.drawCircle(0, 0, 10);
                        brush.blendMode = BlendMode.ADD;
 
                        addChild(new Bitmap(bmd));
                        addChild(brush);
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
                }
 
                private function stage_mouseMove(e:MouseEvent):void
                {
                        brush.x = mouseX;
                        brush.y = mouseY;
                        bmd.draw(this);
                }
 
        }
}


allanon85 23.08.2011 15:49

таким образом можно сделать прозрачность?

silin 23.08.2011 16:05

навскидку что-то можно, но какие-то артефакты лезут
щупать\подбирать надо: может условие threshold'а, может не threshold, а copyPixels c параметром альфа-маски, может еще чего :)
навскидку
Код AS3:

package 
{
        import flash.display.*;
        import flash.events.*;
        import flash.geom.Point;
        [SWF(backgroundColor=0x000000)]
        public class Main extends Sprite
        {
                private var bmd:BitmapData = new BitmapData(400, 200, true, 0xFF8080C0);
                private var brush:Sprite = new Sprite();
                public function Main():void
                {
 
                        brush.graphics.beginFill(0xFFFFFF);
                        brush.graphics.drawCircle(0, 0, 10);
 
                        addChild(new Bitmap(bmd));
                        addChild(brush);
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
                }
 
                private function stage_mouseMove(e:MouseEvent):void
                {
                        brush.x = mouseX;
                        brush.y = mouseY;
                        bmd.draw(this);
                        bmd.threshold(bmd, bmd.rect, new Point(), "==", 0xFFFFFFFF);
                }
 
        }
}


allanon85 23.08.2011 16:28

интересные артефакты..
полагаю этот вариант не подойдет, ведь если на картинке изначально будет присутствовать цвет удовлетворяющий условию, то он так же заменится.

silin 23.08.2011 17:11

ну да, не универсально, да и кривовато
надежнее будет по-простому копировать с альфа-маской
Код AS3:

public class Main extends Sprite 
{
        private var bmd:BitmapData = new BitmapData(400, 200, true, 0xFF8080C0);
        private var brush:Sprite = new Sprite();
        private var brushContainer:Sprite = new Sprite();
        private var filter:ColorMatrixFilter = new ColorMatrixFilter(
                [ 1, 0, 0, 0, 0,
                0, 1, 0, 0, 0,
                00, 1, 0, 0,
                0, 0, 0, -1, 255]);
 
        public function Main():void
        {
                var r:Number = 20;
                brush.graphics.beginFill(0xFFFFFF);
 
                /*//а можно и с 'мягкими' краями
                var mtrx:Matrix = new Matrix();
                mtrx.createGradientBox(2 * r, 2 * r, 0, -r, -r);
                brush.graphics.beginGradientFill(GradientType.RADIAL, [0xFFFFFF, 0xFFFFFF, 0xFFFFFF], [1, 1, 0], [0, 0xCC, 0xFF], mtrx);
                */

                brush.graphics.drawCircle(0, 0, r);
 
                addChild(new Bitmap(bmd));
                brushContainer.addChild(brush);
                addChild(brushContainer);
                stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
        }
 
        private function stage_mouseMove(e:MouseEvent):void
        {
                brush.x = mouseX;
                brush.y = mouseY;
                var maskBmd:BitmapData = new BitmapData(400, 200, true, 0x0);
                maskBmd.draw(brushContainer);
                maskBmd.applyFilter(maskBmd, maskBmd.rect, new Point, filter);
 
                bmd.copyPixels(bmd, bmd.rect, new Point() , maskBmd, new Point());
        }
}


allanon85 23.08.2011 17:33

То что надо) Спасибо


Часовой пояс GMT +4, время: 14:50.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.