Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.05.2018, 14:20
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 1  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
По умолчанию Алгоритм стерки(Starling)

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

Старый 15.05.2018, 23:36
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 2  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
как вариант - создавать битмапу синюю, её маскировать картинкой (чтоб была форма)
На битмапу вешать слушатель пальца и по событию, определяя место и площадь касания, делать в нужном месте синей битмапы прозрачными пиксели. Что-то такое
__________________
while(live()) { hope(); }

Старый 15.05.2018, 23:57
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 3  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Цитата:
делать в нужном месте синей битмапы прозрачными пиксели
Это через матрицу делать надо?

Старый 16.05.2018, 00:37
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Это через матрицу делать надо?
я бы наоборот закрашивал маску в режиме 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 Кб)
Вложения
Тип файла: swf Eraser.swf (24.3 Кб, 80 просмотров)
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 16.05.2018 в 02:16.
Старый 16.05.2018, 03:49
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 5  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Wolsh Премного благодарен за пример

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:39.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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