Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Применение эффектов на картинках, которые загружаются динамически через XML (http://www.flasher.ru/forum/showthread.php?t=141004)

Universe 13.06.2010 00:12

Применение эффектов на картинках, которые загружаются динамически через XML
 
Привет!Вопрос следующий:
Есть у меня 10 картинок, которые я хочу загрузить через xml...делаю следующим образом:
Код AS3:

var imageLoader:Loader;
var xml:XML;
var xmlList:XMLList;               
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.load(new URLRequest("data/images.xml"));
 
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
function xmlLoaded(event:Event):void
{
        xml = XML(event.target.data);
        xmlList = xml.children();
 
        for(var i:uint = 0; i< xmlList.length(); i++)
        {
                imageLoader = new Loader();
                imageLoader.load(new URLRequest(xmlList[i].attribute("thumb")));
                imageLoader.x = 25;
                imageLoader.y = i * 150 + 25;
                addChild(imageLoader);
        }
}

Эта часть работает отлично!НО!Что если мне надо потом с этими картинками что-то делать, допустим менять их цвет или яркость(другими словами работать с BitmapData), смогу ли я это сделать и если да, то каким образом я должен конвертировать объект imageLoader в что-то что позволило бы мне потом выйти на вышеуказанные эффекты?(подозреваю, что конвертить надо в Bitmap, но как?)

Добавлено через 2 минуты
и ещё одно...как вы считаете, нужно ли мне создавать массив в который я буду сохранять объекты imageLoader, для более удобного обращения к ним позже или есть другой способ потом к ним бращаться без создания массива(с учётом, что их нет на сцене)?

kutuzov 13.06.2010 02:32

битмапу можно взять из loader.content
чтобы её можно было редактировать, нужно при load указать LoaderContext c чекполиси true

если вам изменять яркость нужно только для пользователя (типа навел мышь / убрал), а не для других целей (типа изменил яркость залил на сервер), то можно применять transorm и на объект лоадер, тогда чекполиси ни к чему

Universe 13.06.2010 12:48

а если надо допустим добавить параметр smoothing, чтобы сгладить картинку?
Кстати, loader.content даёт null!

kutuzov 13.06.2010 12:59

Loader.contentLoaderInfo.content
попробуйте этому контент присвоить смузинг тру

Universe 13.06.2010 17:34

а можно как то поменять центральную точку у объекта Loader? Или надо обязательно в спрайт кидать?

kutuzov 13.06.2010 17:36

loader.transform.matrix

Universe 13.06.2010 17:36

Цитата:

Loader.contentLoaderInfo.content
попробуйте этому контент присвоить смузинг тру
за совет большое спасибо, всё сработало! Провтык у меня был в том что я до этого обращался к Loader.contentLoaderInfo.content сразу после строки загрузки, забыл, что надо это дела в функции на комплите :)

Добавлено через 54 секунды
опреативно отвечаете!:) ценю!))

Добавлено через 3 минуты
А если чуток поподробнее? Чтото не нахожу этого свойства в хелпе. Можно строчку кода, как это записывать?

kutuzov 13.06.2010 18:16

любой дисплей обжект имеет свойство трансформ, так же как x и y
внутри трансформа есть матрица смещения matrix, её и нужно задавать
Код AS3:

const m:Matrix = loader.transform.matrix;
m.translate(-25, -25);
loader.transform.matrix = m;

если нужно повернуть объект вокруг определенной точки, то делаем так
Код AS3:

const m:Matrix = loader.transform.matrix;
m.translate(-25, -25); // смещаем в точку где надо крутить
m.rotate(-Math.PI / 18); // крутим на минус 10 градусов
m.translate(25, 25); // возвращаем откуда взяли
loader.transform.matrix = m;

25 - это половина ширины/высоты объекта (в данном случае я крутил вокруг центра)

Universe 13.06.2010 19:02

большое спасибо за пример!:)
а как в этом же примере можно применить к этой картинке размытие и убирать его при наведении на определённую картинку?
Я делаю вот так:
Код AS3:

var imageLoader:Loader;
var holder_mc:Sprite;
//var image_bmd:BitmapData = new BitmapData(150, 150, false, 0x000000)
var image_bmp:Bitmap;
var images_arr:Array = new Array();
var m:uint;
var bfOn:uint = 5;
var xml:XML;
var xmlList:XMLList;
var xmlLoader:URLLoader = new URLLoader();
var dMap:BitmapData;
var bf:BlurFilter = new BlurFilter(5, 5, bfOn);
 
xmlLoader.load(new URLRequest("data/images.xml"));
 
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
 
function xmlLoaded(event:Event):void
{
        xml = XML(event.target.data);
        xmlList = xml.children();               
 
        for(var i:uint = 0; i< xmlList.length(); i++)
        {
                imageLoader = new Loader(); // Лоадер для картинки
                imageLoader.load(new URLRequest(xmlList[i].attribute("thumb")));
                imageLoader.name = xmlList[i].attribute("source");
                imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, showMeContent);
 
        }
}
 
 
 
function rollObj(e:MouseEvent):void
{
        bfOn = 0;
        //e.target.contentLoaderInfo.content.smoothing = true;
        e.target.scaleX = 1.5;
        e.target.scaleY = 1.5;
        trace(e.target.getChildAt(0).bitmapData);
        trace(e.target.getChildAt(0));
        var bf:BlurFilter = new BlurFilter(-5, -5, -5);
        e.target.getChildAt(0).bitmapData.applyFilter(e.target.getChildAt(0).bitmapData, e.target.getChildAt(0).bitmapData.rect, new Point(0,0), bf);
        trace(bfOn)
}
 
function showMeContent(e:Event):void
{
        dMap = new BitmapData(150, 100, false, 0x000000);
        dMap.draw(e.target.content);
        var newBitmap:Bitmap = new Bitmap(dMap);
        holder_mc = new Sprite();
        //holder_mc.addChild(e.target.content);
        holder_mc.x = 125;
        holder_mc.y  = m * 150 + 25;
 
        newBitmap.x = -newBitmap.width/2;
        newBitmap.y = -newBitmap.height/2;
        //trace(e.target.content.x );
        addChild(holder_mc);
        //newBitmap.smoothing = true;
 
 
        dMap.applyFilter(dMap, dMap.rect, new Point(0,0), bf);
        holder_mc.addChild(newBitmap);
        holder_mc.addEventListener(MouseEvent.ROLL_OVER, rollObj);
        m++;
}

Применить фильтер получается, но не получается его убрать при наведении? Как его можно убрать?

kutuzov 13.06.2010 19:18

делая applyFilter вы изменяете сами пиксели в исходном битмапдате
нужно же накладывать фильтры через obj.filters = [new BlurFilter(...)]
чтобы убрать фильтры obj.filters = []


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

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