Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MovieClip скопировать в Bitmap и размыть (http://www.flasher.ru/forum/showthread.php?t=148126)

saikspaik 22.12.2010 11:21

MovieClip скопировать в Bitmap и размыть
 
Вложений: 2
Нужно взять MovieClip, с точкой регистрации по центру, скопировать его в bitmap и размыть.
Все это получается, но как-то странно обрезается bitmap-копия.

Мой код:
Код AS3:

 
var cursor:MovieClip = new MovieClip();
var sight:Sight = new Sight();//Это MovieClip из библиотеки
 
this.addChild(cursor);
cursor.addChild(sight);
 
Mouse.hide();
 
this.addEventListener(Event.ENTER_FRAME, onFrame);
 
function onFrame(e:Event):void {
        cursor.x = mouseX;
        cursor.y = mouseY;
}
 
var bmd:BitmapData;
var bm:Bitmap;
var blur:BlurFilter;
 
bmd = new BitmapData(this.width,this.height,true,0x000000);
bmd.draw(this);
bm = new Bitmap(bmd);
cursor.addChild(bm);
 
blur = new BlurFilter(4, 4, 6);
bmd.applyFilter(bmd, bmd.rect, new Point(0,0), blur);


iNils 22.12.2010 11:48

Исходник посмотреть не могу, но подозреваю, что у вас точка регистрации клипа по центру графики, а не в верхнем левом углу. Соответственно, bmd.draw начинает делать снимок от координат 0,0 в центре, а потом правее и ниже, не захватывая отрицательные координаты. Вам надо либо с помощью Matrix сделать сдвиг для draw, либо... на фига вообще BitmapData тут нужна, когда фильтр можно наложить и на Sight?

PS. Программно создавать MovieClip бессмысленно. Используете Sprite вместо MovieClip.

terbooter 22.12.2010 12:04

Попробовал сдвинуть область срисовки
Код AS3:

bmd = new BitmapData(this.sight.width,this.sight.height,true,0x000000);
var rect:Rectangle = this.sight.getBounds(cursor);
trace(rect);
bmd.draw(this.sight, null, null, null, rect);

Странно... В плюс сдвигается (если у rect координаты сдвигать в положительную сторону),
а в минус нет.

Создайте еще один экземпляр sight и наложите на него фильтр.
Можно еще cacheAsBitmap выставить

cleptoman 22.12.2010 12:23

да не Rectangle нужен, а Matrix

terbooter 22.12.2010 13:05

Цитата:

Сообщение от cleptoman (Сообщение 959167)
да не Rectangle нужен, а Matrix

А почему в плюс сдвигается?

iNils 22.12.2010 13:28

Код AS3:

/// смещение по оси x и y
var dx:int = -20;
var dy:int = -20;
 
/// исходный спрайт
var s:Sprite = new Sprite ();
s.x = s.y = 50;
s.graphics.beginFill (0xFF0000);
s.graphics.drawRect ( -20, -20, 40, 40);
s.graphics.drawRect ( -10, -10, 20, 20);
s.alpha = .5
addChild (s)
 
/// делаем снимок
var bmpCrop:BitmapData = new BitmapData (40, 40);
bmpCrop.draw (s, new Matrix (1, 0, 0, 1, -dx, -dy));
/// показываем его
var bitmapCrop:Bitmap = new Bitmap (bmpCrop)
bitmapCrop.x = 100;
addChild (bitmapCrop);


saikspaik 23.12.2010 00:33

Цитата:

фильтр можно наложить и на Sight
Цитата:

Создайте еще один экземпляр sight и наложите на него фильтр.
Как? Ведь Sight - это MovieClip, или возможно Sprite, а applyFilter применяется только к BitmapData.

iNils
Посмотрел код, теперь BitmapData-копия не съезжает, но blur размывает только середину рисунка, а края не хочет. Я сделал dx и dy больше (то есть меньше), после этого верхняя и левая граница размылись, а правая и нижняя остались неразмытыми.

Вообще конечно лучше размывать не Bitmap, а спрайт, но пока не найду как.

vinch 23.12.2010 00:37

Код AS3:

var a:MovieClip = new MovieClip();
a.filters = [new BlurFilter(...)];


saikspaik 25.12.2010 06:23

Благодаряю всех ответивших, ваши посты помогли мне.


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

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