Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Буфер обмена во Флеш. Есть ли? И как с ним работать? (http://www.flasher.ru/forum/showthread.php?t=194007)

MIHAnik 06.02.2013 10:27

Буфер обмена во Флеш. Есть ли? И как с ним работать?
 
Допустим на экране флешки играются куча мувиков, с разными масками и по кнопкам. Но дело не в этом. Мне нужно все это сграбить как одну картинку. По принципу буффера. Есть ли что то подобное в флеш, или как можно подобного добиться?

FlashRus 06.02.2013 10:36

http://help.adobe.com/ru_RU/FlashPla...redObject.html

MIHAnik 06.02.2013 10:45

FlashRus, эмм " ищи тут"? "что найдеш то твое"? Мнеб для AS2.

mooncar 06.02.2013 10:50

Если уж говорить о способах хранения данных, то для AS2 вот правильная справка: SharedObject.

Но видимо автора интересует в первую очередь - как собственно "сграбить".
Для этого можно воспользоваться методом BitmapData.draw(), применив его для общего контейнера, где все это находится.
В дальнейшем полученной битмапой можно закрасить произвольный мувик с помощью attachBitmap.

MIHAnik 06.02.2013 11:14

mooncar, да точно это оно. Я с ним не сталкивался раньше. Мог бы ктонибудь описать последовательность работы с командой в кратце? создаю new BitmapData добавляю аттачем туда мувки и заливаю одним большим мувиком с помощью draw()? Верно или совсем не так?

mooncar 06.02.2013 11:19

Совсем не так - срисовываем с контейнера с помощью draw в новосозданную битмапу, а потом ее добавляем, куда надо с помощью attachBitmap.

Вот тут есть пример использования такого подхода.

Только не забываем импортировать класс Bitmapdata в проект.

MIHAnik 06.02.2013 11:24

mooncar,Пасиб огромное, пример про то чего я и пытаюсь добиттся)) А как думаеш такие большие пиксили просто частный случай? Если разрешение хорошее такого не будет?

mooncar 06.02.2013 11:26

В том примере пиксели видны только при программном увеличении. Если вы растеризуете, а потом добавите куда-то векторный контент, то разницы не заметите.
Ну и еще поэкспериментируйте с параметром, отвечающим за сглаживание в методе draw.

MIHAnik 06.02.2013 12:40

правильно ли я разобрался?
Код AS1/AS2:

function rasterizeMovieClip(obj, bdLev) {                                 //подгружаем мув и его глубину
        var _par = obj._parent;                                                // определяем родителя.
        var _lev = (bdLev) ? bdLev : _par.getNextHighestDepth(); // если глубина не подгружина  определяем.
        var bd_mc = _par.createEmptyMovieClip(obj._name + "BD", _lev); // в родителе мув создаем еще один мув
        var bd = new flash.display.BitmapData(obj._width, obj._height, true, 0x00000000); // здесь не совсем понятно
        bd.draw(obj);                                                        // пишем в новоиспеченную область наш первый мув
        bd_mc.attachBitmap(bd,bd_mc.getNextHighestDepth());// добавляем в мув2 область bd с мувиком1 на его глубине.
        bd_mc._x = obj._x;// перемещаем
        bd_mc._y = obj._y;
        obj.swapDepths(_par.getNextHighestDepth());            //перемещаем первый мув выше по глубине.
        obj.removeMovieClip();                                            // вот тут не понятно зачем удаляем мув1
}

Значит мне нужно действовать по такому принципу? Тоесть просто всю сцену со всем борохлом нужно обеденить в один mc к примеру под названием obj верно?

mooncar 06.02.2013 12:44

Да, суть вы верно уловили.
Название не obj , поскольку это аргумент функции.
Просто ее применяете (второй арг. не обязателен):
Код AS1/AS2:

rasterizeMovieClip(имя_вашего _контейнера);

где имя_вашего _контейнера - это инстанс-нейм мувика на сцене (т.е. не библиотечное имя, а имя экземпляра).

Все это приведет к замене векторного контента на растровый.

MIHAnik 06.02.2013 12:58

mooncar, чтож пока все понятно. Искренне благодарен)

mooncar 06.02.2013 13:22

Только что обратил внимание на ваши комментарии. В них не совсем все так. Вот как:
Код AS1/AS2:

 
 //передаем аргументом  контейнер-оригинал для отрисовки и глубину (по желанию)
function rasterizeMovieClip(obj, bdLev)
{
        var _par = obj._parent; //получаем ссылку на родителя  оригинального мувика
        var _lev = (bdLev) ? bdLev : _par.getNextHighestDepth(); //если не задали уровень для размещения копии, то вычислим первый свободный уровень у родителя
        var bd_mc = _par.createEmptyMovieClip(obj._name + "BD", _lev); //создаем мувик, куда будем копировать
        var bd = new flash.display.BitmapData(obj._width, obj._height, true, 0x00000000); //создаем экземпляр битмапы
        bd.draw(obj); //отрисовываем в него оригинал, теперь битмапа - это битмапа-слепок
        bd_mc.attachBitmap(bd, bd_mc.getNextHighestDepth()); //в контейнер-копию добавляем битмапу-слепок
        bd_mc._x = obj._x; //выставляем его в тех же координатах
        bd_mc._y = obj._y;
 
      //это важно! если оригинальный мувик не был создан программно, а нарисован руками,
      //то его глубина будет отрицательной, и он не удалится с помощью removeMovieClip
      //поэтому выносим оригинал на первую положительную доступную глубину:
        obj.swapDepths(_par.getNextHighestDepth());
        obj.removeMovieClip(); //.. и оригинал удаляем
}


MIHAnik 06.02.2013 15:01

mooncar, спасибо!!)) теперь все понятно. Единственное не получается сместить результат до того как он будет зафиксирован в bd_mc. У меня получается что отрисовка происходит в углу рабочего стола и появляется обрез краев, пробовал смещать все мувы и родителя, но не помогает.

mooncar 06.02.2013 15:27

Вложений: 1
При отрисовке битмапы из контейнера берется вся графическиая информация справа и вниз от нуля координат, то есть только всё то, что находится на положительных координатах относительно внутреннего нуля координат контейнера. Соответственно все остальное игнорируется (обрезается).
Поэтому при создании мувика следите, чтобы (0, 0) приходился в левый верхний угол, а не в центр (при конвертации объектов в мувик эта точка совпадает с "точкой регистрации").

Вложение 29073

Если уже все сделано, то выделите все объекты внутри контейнера и сдвиньте их вправо и вниз, чтобы (0, 0) осталась в левом верхнем углу.

MIHAnik 06.02.2013 15:38

mooncar, аха, ну теперь все встало на свои места, у меня просто в муве есть анимация и она временами уходит в отрицательные координаты. Я помню в старом флеше была функция смены центра мува, сейчас не могу найти, хотя я ее может с чем то путаю. и еще у меня в муве статичные слои всегда поверх анимации, это нужно решать как то с помощью getNextHighestDepth()? Спасиб тебе mooncar жаль тут репку набить нельзя)

mooncar 06.02.2013 15:52

В общем так - все что нужно делать - это правильно распределять все изначально.
Если нужно что-то анимировать всегда поверх статичного контента - значит под всё это рисовать контейнер (пусть даже пустой начально) и его слой в IDE заранее располагать поверх.
Можно свопить вверх и программно. То есть узнавая первую свободную глубину с помощью getNextHighestDepth() и далее mc.swapDepths(номер_глубины) или с указанием некой конкретной глубины.

MIHAnik 07.02.2013 12:43

Возник такой вопрос. Как мне закинуть bd_mc в другой какой то клип и узнать путь к нему? Изменил строчку на var _par = _root.Lup, новосозданный мув переместился, но я не знаю как к нему обратится. По пути var _root.Lup.bd_mc нет реакции.

mooncar 07.02.2013 12:57

Еще раз. В этой функции ее автор получает, а не задает ссылку на родителя оригинального клипа с помощью выражения:
Код AS1/AS2:

var _par = obj._parent;

А чтобы сделать где-то копию, создавайте там, где нужно var bd_mc .
В данной функции автор хочет, чтобы копия была там же, где и оригинал, поэтому используется _par - ссылка на контейнер, содержащий исходный объект.
Код AS1/AS2:

var bd_mc = _par.createEmptyMovieClip(....);

Вы же можете создавать где угодно:
Код AS1/AS2:

var bd_mc = _root.createEmptyMovieClip("имя_копии", _root.getNextHighestDepth());

Код AS1/AS2:

var bd_mc = _root.путь1.путь2.createEmptyMovieClip("имя_копии", _root.путь1.путь2.getNextHighestDepth());

При этом внутри функции будет существовать bd_mc - ссылка к созданной копии, а вообще обращаться к мувику-копии можно будет
Код AS1/AS2:

_root.путь1.путь2.имя_копии


MIHAnik 07.02.2013 13:03

mooncar, прости)) Я проверял стандартным для себя тестом, перемещением по одной оси. Из за того что запись всегда происходит в одну координату родителя, перемещения не было. Переделал на маску, все заработало. Влюбом случае очень благодарен за таки подробные ответы!))


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

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