Форум Flasher.ru

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

Godwarlock 15.05.2018 14:20

Алгоритм стерки(Starling)
 
Вложений: 3
Привет всем. Подскажите пожалуйста алгоритм стерки для изображения в Starling. В общем суть в том, что есть картинка(текстура), она закрашена в синий цвет например. Нужно проводить мышкой/пальцем, чтобы стереть верхний слой и показывался нижний + ко всему, как то определить % стертости от 0-100%. Пока приходит на ум использование масок, но пока особо вариантов как это механизировать нету. Ниже показано, что примерно имею ввиду.

ZergMaster 15.05.2018 23:36

как вариант - создавать битмапу синюю, её маскировать картинкой (чтоб была форма)
На битмапу вешать слушатель пальца и по событию, определяя место и площадь касания, делать в нужном месте синей битмапы прозрачными пиксели. Что-то такое

Godwarlock 15.05.2018 23:57

Цитата:

делать в нужном месте синей битмапы прозрачными пиксели
Это через матрицу делать надо?

Wolsh 16.05.2018 00:37

Вложений: 1
Цитата:

Это через матрицу делать надо?
я бы наоборот закрашивал маску в режиме blendMode "eraze", ибо "рисовать прозрачные пиксели" можно только математически устанавливая каждый пиксель)) Но вот с получением этой самой "обратной" маски с дыркой-фигурой понадобится возня.

Как другой вариант — делаешь синюю битмапдату, копируешь в нее альфа-канал с исходной картинки (получаешь синюю картинку). Там где водишь мышкой, копируешь пиксели с исходной битмапдаты. Никаких масок))

Но если считать проценты обязательно, то лучше всетаки иметь отдельную "синюю" битмапдату и "стирать" её.
Тогда можно предварительно посчитать непрозрачные пиксели и считать это за 100% (или 0% стертости), и потом соотв. пересчитывать сколько их осталось и сколько это процентов. Но не уверен, что скорость подсчета будет удовлетворительной(

Как-то так..
Код AS3:

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);
                }
        }
}

Eraser.swf   (24.3 Кб)

Godwarlock 16.05.2018 03:49

Wolsh Премного благодарен за пример


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

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