PDA

Просмотр полной версии : Метод addChild в нужный контейнер


pomuс
20.12.2012, 16:09
Привет
Ситуация такая:
Мне надо правильно направить ребенка методом addChild.
Instance name контейнера указать я не могу, т.к. на сцене несколько контейнеров, и и у элементов внутри них единый код через e.currentTarget
Получается если я просто добавляю addChild -ом, то элемент ложится поверх всего на главную сцену, и он виден на всех контейнерах, когда я меняю их видимость
function clicked (e:MouseEvent):void{

if (animation == true){
return;
}
else{
srcX = e.currentTarget.x;
srcY = e.currentTarget.y;
var scaleNew = (stage.stageHeight-240) / e.currentTarget.startHeight;

if (!zoomed){
if (page1.visible == true){
TweenLite.to(page1.ugolki, 0.5, {alpha:0});
}
else {
TweenLite.to(page2.ugolki2, 0.5, {alpha:0});
}
animation = true;
addChild(e.currentTarget as MovieClip);

TweenLite.to(e.currentTarget, 1, {delay:0.2, x:stage.stageWidth/2, y:stage.stageHeight/2, scaleX:scaleNew, scaleY:scaleNew, ease:Back.easeOut, onComplete: finishedAnimation});
zoomed = true;
}
else{
if (page1.visible == true){
TweenLite.to(page1.ugolki, 0.3, {delay: 0.5, alpha:1});
page1.addChild(page1.ugolki);
}
else{
TweenLite.to(page2.ugolki2, 0.3, {delay: 0.5, alpha:1});
page2.addChild(page2.ugolki2);
}
animation = true;
TweenLite.to(e.currentTarget, 0.6, {x:e.currentTarget.startX, y:e.currentTarget.startY, scaleX:1, scaleY:1, ease:Back.easeIn, onComplete: finishedAnimation});
zoomed = false;
}
}
}

Wolsh
20.12.2012, 19:18
Поскольку вопроса пока не прозвучало, а следующим сообщением будет "и чо, опять ни одного телепата на форуме?", попробую начать дискуссию.
1)
TweenLite.to(page2.ugolki2, 0.3, {delay: 0.5, alpha:1});
page2.addChild(page2.ugolki2);
page2.visible = false;О мой мозг...

2) Что вдохновило Вас 7 раз написать "e.currentTarget" в одной функции?

pomuс
20.12.2012, 19:46
Wolsh
вопрос состоит в том, что можно ли как то указать в методе addChild тот контейнер, откуда изначально вызван клип? Если бы там был всего 1 контейнер, то понятно что это выглядело бы как page1.addChild(e.currenttarget); . но в данном случае у e.currentTarget может быть как page1, так и page7.
В по моей логике я бы это написал как parent.e.currentTarget.addChild(e.currentTarget) .. "добавить в изначального родителя"

1) да, это я что то влепил не то, когда экспериментировал наверное
2) ну насколько хватало навыков, так и делал.. а есть вариант сделать проще?

KBAC
20.12.2012, 19:59
Опишите что происходит у вас, и что должно происходить. Если объект на сцене у него не null свойство parent. Так вы можете получить ссылку на его "контейнер" и в него уже добавлять (вам правда нужно добавлять объект туда где он уже есть ещё раз?) объект.

pomuс
20.12.2012, 21:08
Если объект на сцене у него не null свойство parent. Так вы можете получить ссылку на его "контейнер" и в него уже добавлять
чего то не понял

ну да, надо добавлять туда же. Конечно если бы можно было как то назначать индекс слоя подругому как не addChild то пошел бы и другой вариант. Я знаю про setChildIndex но там суть одна и та же, контейнер надо указать

Wolsh
20.12.2012, 21:26
а есть вариант сделать проще?
Ну да.. записать ссылку на объект в переменную
function clicked (e:MouseEvent):void{
var mc:MovieClip = e.currentTarget as MovieClip;
if (animation == true){
return;
}
else{
srcX = mc.x;
srcY = mc.y;
var scaleNew = (stage.stageHeight-240) / mc.startHeight;

if (!zoomed){
if (page1.visible){
TweenLite.to(page1.ugolki, 0.5, {alpha:0});
}
else {
TweenLite.to(page2.ugolki2, 0.5, {alpha:0});
}
animation = true;
mc.parent.addChild(mc); // наверное, так?

TweenLite.to(mc, 1, {delay:0.2, x:stage.stageWidth/2, y:stage.stageHeight/2, scaleX:scaleNew, scaleY:scaleNew, ease:Back.easeOut, onComplete: finishedAnimation});
zoomed = true;
}
else{
if (page1.visible){
TweenLite.to(page1.ugolki, 0.3, {delay: 0.5, alpha:1});
page1.addChild(page1.ugolki);
}
else{
TweenLite.to(page2.ugolki2, 0.3, {delay: 0.5, alpha:1});
page2.addChild(page2.ugolki2);
}
animation = true;
TweenLite.to(mc, 0.6, {x:mc.startX, y:mc.startY, scaleX:1, scaleY:1, ease:Back.easeIn, onComplete: finishedAnimation});
zoomed = false;
}
}
}А то ж не только читать тяжело, Вы заставляете плеер каждый раз разыскивать объект через другие ссылки.
Так же избыточны конструкции типа if (page1.visible == true). Вы берете булево от булево. Можно бесконечно упаковывать их в скобки например)) :
if (((page1.visible == true) == true) == true) {}
Выглядит нелепо, но Вы делеаете абсолютно то же самое, когда пишете if (page1.visible == true).
Потому как эти выражения равны: (page1.visible == true) абсолютно равно (page1.visible)

caseyryan
20.12.2012, 21:28
Я бы на вашем месте стер весь этот код и написал с нуля, более обдуманную версию. Тут вообще не понятно что и куда добавляется

pomuс
21.12.2012, 01:15
Wolsh спасибо, ввел изменения.
Просто я так изначально писал, т.к. совсем зеленый в АС3, и таким способом мне легче было проследить логику скрипта