|
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Алгоритм стерки(Starling)
Привет всем. Подскажите пожалуйста алгоритм стерки для изображения в Starling. В общем суть в том, что есть картинка(текстура), она закрашена в синий цвет например. Нужно проводить мышкой/пальцем, чтобы стереть верхний слой и показывался нижний + ко всему, как то определить % стертости от 0-100%. Пока приходит на ум использование масок, но пока особо вариантов как это механизировать нету. Ниже показано, что примерно имею ввиду.
|
|
|||||
как вариант - создавать битмапу синюю, её маскировать картинкой (чтоб была форма)
На битмапу вешать слушатель пальца и по событию, определяя место и площадь касания, делать в нужном месте синей битмапы прозрачными пиксели. Что-то такое
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Цитата:
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Как другой вариант — делаешь синюю битмапдату, копируешь в нее альфа-канал с исходной картинки (получаешь синюю картинку). Там где водишь мышкой, копируешь пиксели с исходной битмапдаты. Никаких масок)) Но если считать проценты обязательно, то лучше всетаки иметь отдельную "синюю" битмапдату и "стирать" её. Тогда можно предварительно посчитать непрозрачные пиксели и считать это за 100% (или 0% стертости), и потом соотв. пересчитывать сколько их осталось и сколько это процентов. Но не уверен, что скорость подсчета будет удовлетворительной( Как-то так.. package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMode; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.geom.Rectangle; /** * ... * @author Wolsh */ public class Main extends Sprite { [Embed(source = "../lib/img_3.png")] private var _Img:Class; private var _maskContainer:Sprite; private var _invertMaskBMD:BitmapData; private var _brushBMD:BitmapData; private var _sourcePixelsCount:uint; public function Main() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point var imageBMD:BitmapData = (new _Img() as Bitmap).bitmapData; var sourceImg:Bitmap = new Bitmap(imageBMD); this.addChild(sourceImg); sourceImg.x = 100; sourceImg.y = 100; //// бутерброд с BlendMode var maskBMD:BitmapData = new BitmapData(imageBMD.width, imageBMD.height, true, 0xFF0000FF); var maskBitmap:Bitmap = new Bitmap(maskBMD); _maskContainer = new Sprite(); this.addChild(_maskContainer); _maskContainer.x = 100; _maskContainer.y = 100; _maskContainer.blendMode = BlendMode.LAYER; _maskContainer.addChild(maskBitmap); var imageMask:Bitmap = new Bitmap(imageBMD); _maskContainer.addChild(imageMask); imageMask.blendMode = BlendMode.ERASE; //// инвертируем маску _invertMaskBMD = new BitmapData(imageBMD.width, imageBMD.height, true, 0x000000FF); _invertMaskBMD.draw(_maskContainer, null, null, BlendMode.LAYER); imageMask.bitmapData = _invertMaskBMD; //// "кисточка" _brushBMD = new BitmapData(40, 40, true, 0x00FFFFFF); var brushShape:Shape = new Shape(); brushShape.graphics.beginFill(0x0000FF); brushShape.graphics.drawCircle(20, 20, 20); _brushBMD.draw(brushShape); //// слушатель рисовалки _maskContainer.addEventListener(MouseEvent.MOUSE_MOVE, handlerDraw); } private function handlerDraw(e:MouseEvent):void { _invertMaskBMD.copyPixels(_brushBMD, new Rectangle(0, 0, 40, 40), new Point(e.localX -20, e.localY - 20), null, null, true); } } }
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 16.05.2018 в 02:16. |
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Wolsh Премного благодарен за пример
|
Часовой пояс GMT +4, время: 21:43. |
|
« Предыдущая тема | Следующая тема » |
|
|