PDA

Просмотр полной версии : Как приаатачить клип в клип после загрузки в него jpg?


Жень Шень
21.10.2008, 13:54
Привет!
В мувик на сцене загрузил MovieClipLoader-ом картинку (jpg). Возникла необходимисть приаттачить в этот клип другой клип из библиотеки. И не получается.
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
image_mc._xscale = image_mc._yscale=50;
image_mc._x = 100;
image_mc._y = 100;
image_mc.onPress = function() {
// пробую сразу подгрузить и клип-маркер
this.attachMovie("gmarcer", "gmarcer", 1000);
trace("1 "+this.gmarcer);
this.startDrag();
};
image_mc.onRelease = function() {
this.stopDrag();
};
};
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);
// загрузка картинки
b_btn.onPress = function() {
image_mcl.loadClip("1.jpg", image_mc);
};
// до загрузки картинки gmarcer аттачится, после нет
b1_btn.onPress = function() {
image_mc.attachMovie("gmarcer", "gmarcer", 1000);
trace("2 "+image_mc.gmarcer);
};
Это упрощенный код.
Подскажите, где грабли. Спасибо.

iNils
21.10.2008, 14:23
Грабли в том, что этого сделать просто нельзя. После загрузки в клип объекта, сам клип подменяется этим объектом. Если бы грузили не картинку, а swf, то аттач бы произошел не в image_mc, а в рут самого swf. А так как грузим картинку, то аттачить просто некуда.

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

silin
21.10.2008, 14:45
грабли в том, что приаттачить к загруженному можно только из его же библиотеки
(с swf будет та же история)

если грузить в контейнер, созданный для картинки, то сам image_mc будет 'своим' и все получится
image_mcl.loadClip("1.jpg", image_mc.createEmptyMovieClip("body", 0));

Жень Шень
21.10.2008, 14:51
Спасибо, iNils.
Я в принципе так и делал. В контейнере паралельном клипу для картинки грузились 4 клипа-маркера. Ими я масштабировал кртинку. добрый кусок кода отвечал за совмещения двух клипов: картинки и контейнера с маркирами. Когда возникла необходимость группировки нескольких клипов (задача гоуппировки решена), захотелось помечать клипы в группе. Снова использовать контейнер с маркирами не хотелось из-за кода. Там, где в гуппу входили клипы и програмная графика все тип-топ, а с jpg - облом. Это на стадии разработки надо было предусмотреть. А сейчас надо перелапатить около 2000 строк для добавления еще одного контейнера. Что самое обидное - к клипу с загруженной джепежкой обращаешься как к клипу, а он уже и не клип...
Добавлено:
Ой, уважаемый гуру silin что-то дабавил. Спасибо, сейчас буду пробовать.

silin
21.10.2008, 14:57
>>обращаешься как к клипу, а он уже и не клип...
не, он клип, у него все(свойства/методы) есть, кроме доступа к библиотеке основного

iNils
21.10.2008, 14:58
грабли в том, что приаттачить к загруженному можно только из его же библиотеки...Кстати да :rolleyes:

silin
21.10.2008, 15:06
есть хаковый выход:
аттачить от имени родителя, но в себя же
target_mc._parent[target_mc].attachMovie("gmarcer", "gmarcer", 1000);

UPD: не работает так, сори

chingachgoog
21.10.2008, 15:29
есть хаковый выход:
аттачить от имени родителя, но в себя же
target_mc._parent[target_mc].attachMovie("gmarcer", "gmarcer", 1000);

Не понял в чем выход? Обмануть самого себя? Хочу аттачить в target_mc (image_mc), но все равно приатачу в рут? :)

silin
21.10.2008, 15:34
сори, не выход это никакой - померещилось..
спасибо, chingachgoog

iNils
21.10.2008, 15:50
Как минимум, писать надо так
target_mc._parent["target_mc"]
Но все равно это не хак.

Жень Шень
21.10.2008, 16:26
target_mc._parent[target_mc].attachMovie("gmarcer", "gmarcer", 1000);
Я еще вчера так пытался обмануть и в кавычках :D:D:D
А насчет "а он уже и не клип..." - ну, это я так, образно. Мы ж "картинкой" манипулируем...
Господа, а что тогда есть jpg в мувике? Объект? Если "После загрузки в клип объекта, сам клип подменяется этим объектом", то картинка - суть клип, но уже без возможности аттача? А может еще что-нить не как у клипа? Надо будет на досуге перепроверить все методы...

chingachgoog
21.10.2008, 16:30
а что тогда есть jpg в мувике? Объект?


Ну да, графический объект. Растровый. Как если бы вы его не грузили извне, а сразу на таймлайн положили во флеш-редакторе.

Жень Шень
21.10.2008, 17:16
Это понятно.
Вот сделал по "рецепту" silin-а.
Да, добавился клип body, да, в нем картинка. Вешаю на ЭТОТ клип драг. Работает. Но, и на сам image_mc выполняет драг!!!
К моему примеру (чтоб сами не парились набирать код) приложите 1.jpg. Запустите, загрузите картинку (1-я кнопка). Оттащите и нажмите на зеленый image_mc. Тянется. Тогда кто взял на себя метод startDrag()?
И второе. Теперь пытаюсь аттачить маркер в image_mc. Грузится. Но картинка исчезает.
Дописано:
Решил таким способом выкрутится (таки с подачи Максима!). Добавил пустой мувик в библиотеку и
b_btn.onPress = function() {
mc_mc.image_mc.attachMovie("conteiner", "conteinerTop", 1001);
mc_mc.image_mc.attachMovie("conteiner", "conteinerBottom", 1000);
image_mcl.loadClip("1.jpg", mc_mc.image_mc.conteinerBottom);
};
для второй кнопкиb1_btn.onPress = function() {
mc_mc.image_mc.conteinerTop.attachMovie("gmarcer", "gmarcer", 1000);
};
и, естественно, для mc_mc.image_mc -> this.startDrag();

silin
21.10.2008, 17:30
ты аттачишь на ту же глубину, потому и исчезает..

никакой путаницы с "лишним драгом" не будет если повесить onPress/startDrag именно на загруженный мувик:
mclListener.onLoadInit = function(target_mc:MovieClip) {
target_mc.onPress = function() {
this.startDrag();
};
target_mc.onRelease = target_mc.onReleaseOutside =function() {
stopDrag();
};
};

Жень Шень
21.10.2008, 17:44
ты аттачишь на ту же глубину, потому и исчезает..[/CODE]
Точно!!! Спасибо. Это моя невнимательность. Таки остановлюсь на твоем варианте!
Благодарю также остальных участников обсуждения. Моя проблема решена.