|
|
|||||
ластик
Подскажите как реализовать ластик. Не прямоугольной формы. Допустим круг.
Единственное что пришло в голову, это взять координаты всех пикселей ластика и на картинке найти пиксели по этим координатам, затем провести с ними необходимые манипуляции. Может есть другой способ? |
|
|||||
можно поиграться с blendMode ластика и отрисовкой результата в битмап
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); } } } |
|
|||||
таким образом можно сделать прозрачность?
|
|
|||||
навскидку что-то можно, но какие-то артефакты лезут
щупать\подбирать надо: может условие threshold'а, может не threshold, а copyPixels c параметром альфа-маски, может еще чего навскидку 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); } } } |
|
|||||
интересные артефакты..
полагаю этот вариант не подойдет, ведь если на картинке изначально будет присутствовать цвет удовлетворяющий условию, то он так же заменится. |
|
|||||
ну да, не универсально, да и кривовато
надежнее будет по-простому копировать с альфа-маской 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, 0, 0, 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()); } } Последний раз редактировалось silin; 23.08.2011 в 17:19. |
|
|||||
То что надо) Спасибо
|
Часовой пояс GMT +4, время: 15:43. |
|
« Предыдущая тема | Следующая тема » |
|
|