Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Тень для полупрозрачного объекта (http://www.flasher.ru/forum/showthread.php?t=179786)

Evgan 21.05.2012 19:08

Тень для полупрозрачного объекта
 
Приветствую всех.

Столкнулся с такой проблемой:
Программно создается объект mc (Sprite), у которого имеется полупрозрачный фон. Для всего объекта применяю фильтр тени
Код AS3:

mc.filters = [new DropShadowFilter]

В результате, из-за полу прозрачности объектов входящих в состав mc, получается не тот результат.
В добавок, объект имеет сложную форму и решить проблему путём создания прямоугольника с размерами исходного mc и уже на него наложить тень не получиться.
Пытаюсь найти решение путём создания дубликата исходного mc:

PHP код:

public    function duplication_sprite(sprite:Sprite): Sprite {
var 
bmd        :BitmapData        =        new BitmapData(sprite.width,sprite.height,true,0x000000)    ;
bmd.draw(sprite)    ;
var    
bm        :Bitmap            =        new Bitmap(bmd);
bm.smoothing                    =        true    ;
var 
sprite        :Sprite            =         new Sprite();


Однако, в результате мы получаем точную копию (с прозрачностью, от которой надо избавиться), и в добавок тратим на это много ресурсов +(. А хочется, что бы в результате получился объект с точной формой исходного mc и залитый сплошной непрозрачной заливкой, что бы могли смело применять к нему фильтры.

Подскажите пожалуйста решение данного вопроса. Если он имеется конечно же.
Спасибо.

Hauts 21.05.2012 20:03

Попробуйте многократно отрисовывать полупрозрачный клип, таким образом степень прозрачности будет уменьшаться. В цикле от 0 до 20 прогоните bmd.draw(sprite).

Кстати
Код AS3:

mc.filters = [delete DropShadowFilter]

шокирует, как и оформление (!) php-кодом.

Партизан 21.05.2012 20:09

Думаю проще создать Bitmap отрисовать в него спрайт, применив какой-нибудь blendMode.

Hauts 21.05.2012 20:27

Можно еще так:
Код AS3:

bmd.draw(sprite, new Matrix(), new ColorTransform(0, 0, 0, 0, 0, -255, -255, 255));

— получите ваш клип полностью черного цвета.

Evgan 21.05.2012 22:25

Цитата:

Сообщение от Hauts (Сообщение 1080600)
Кстати
Код AS3:

mc.filters = [delete DropShadowFilter]

шокирует, как и оформление (!) php-кодом.

Извиняюсь, обшибся в торопях

Добавлено через 3 минуты
Цитата:

Сообщение от Hauts (Сообщение 1080607)
Можно еще так:
Код AS3:

bmd.draw(sprite, new Matrix(), new ColorTransform(0, 0, 0, 0, 0, -255, -255, 255));

— получите ваш клип полностью черного цвета.

Спасибо большое, нужная информация. Теперь по средством копирования клипа через Bitmap всё работает как надо. Но всё же он "тяжеловат"+(

Партизан 22.05.2012 01:18

Цитата:

Сообщение от Hauts (Сообщение 1080607)
Код AS3:

bmd.draw(sprite, new Matrix(), new ColorTransform(0, 0, 0, 0, 0, -255, -255, 255));

— получите ваш клип полностью черного цвета.

С красноватым оттенком думаю должен получиться... Если красный изначально был. Хотя может и ошибаюсь.

silin 22.05.2012 11:01

как вариант colorTransform копии спрайта, без отрисовки в битмап
Код AS3:

public function duplication_sprite(sprite:Sprite):Sprite
{
        var spriteClass:Class = Object(sprite).constructor;
        var res:Sprite = new spriteClass() as Sprite;
        res.transform.colorTransform = new ColorTransform(0, 0, 0, 1, 0, 0, 0, 255);
        return res;
}

Добавлено через 4 минуты
упс, сори: фильтры не работают с таким (под colorTransform ) спрайтом

Добавлено через 13 минут
но выкрутится можно: обернуть трансформированный спрайт еще одним, например
Код AS3:

public function duplication_sprite(sprite:Sprite):Sprite
{
        var spriteClass:Class = Object(sprite).constructor;
        var res:Sprite = new spriteClass() as Sprite;
        res.transform.colorTransform = new ColorTransform(0, 0, 0, 1, 0, 0, 0, 255);
        var res1:Sprite = new Sprite();
        res1.addChild(res);
        return res1;
}


Evgan 22.05.2012 11:38

Цитата:

Сообщение от silin (Сообщение 1080676)

Добавлено через 13 минут
но выкрутится можно: обернуть трансформированный спрайт еще одним, например
Код AS3:

public function duplication_sprite(sprite:Sprite):Sprite
{
        var spriteClass:Class = Object(sprite).constructor;
        var res:Sprite = new spriteClass() as Sprite;
        res.transform.colorTransform = new ColorTransform(0, 0, 0, 1, 0, 0, 0, 255);
        var res1:Sprite = new Sprite();
        res1.addChild(res);
        return res1;
}


Хм, что то у меня не работает это код. К примеру, по средством:

Код AS3:

public        function renderSpriteFill(_w:int = 15,_h:int=15,_r:int=0,_color:Number=0x00000): Sprite {
        var _temp        :Sprite        =        new        Sprite();
        _temp.graphics.clear();       
        _temp.graphics.beginFill(_color, 1);
        _temp.graphics.drawRoundRect(0, 0, _w, _h, _r);       
        return        _temp;
}

создаю простой спрайт, и дублирую его вашим способом:
Код AS3:

var _temp        :Sprite = renderSpriteFill(30,30);
trace(_temp.width+ ' <> '+_temp.height); // выдаёт 30 <> 30
var        dubl        :Sprite = duplication_sprite(_temp)       
trace(dubl.width+ ' <> '+dubl.height); // выдаёт 0 <> 0

Может я что то не учитываю?..

silin 22.05.2012 11:46

дада верно, это будет работать только для 'готовых' (библиотечных, например) спрайтов
все, что нарисовано программно после создания спрайта, естественно в такой дубликат не попадет

Evgan 22.05.2012 12:15

Цитата:

Сообщение от silin (Сообщение 1080682)
дада верно, это будет работать только для 'готовых' (библиотечных, например) спрайтов
все, что нарисовано программно после создания спрайта, естественно в такой дубликат не попадет

Понял. Спасибо за информацию.


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

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