PDA

Просмотр полной версии : Дублирование MovieClip


Lokmaster
22.02.2013, 16:40
В основной сцене есть MovieClip "StruiaB". Внутри него MovieClip "Kaplia"
Надо распределить 40 MovieClip "StruiaB" по эллипсу, что успешно получается, внутри каждого по 100 MovieClip "Kaplia"

Вот так выходит дублировать 40 MovieClip "StruiaB",

for (i=0; i<=3; i++) {
if(i>3){j=-1}else{j=1}
StruiaB.duplicateMovieClip("StruiaB"+i, i);
for (a=1; a<100; a++) {
this["StruiaB"+i]["Kaplia"].duplicateMovieClip(this["StruiaB"+i]["K"+a], a);
}
trace(StruiaB2.K5._y);
T = Math.tan(i*Math.PI/20);
this["StruiaB"+i]._x = j*65/Math.pow(Math.pow(T, 2)+0.66015625, 0.5);
this["StruiaB"+i]._y = this["StruiaB"+i]._x*T;
}

но не получается создать 100 MovieClip "Kaplia" в каждой.

Hauts
22.02.2013, 16:57
Давненько не использовал duplicateMovieClip. Попробуйте использовать attachMovie, насколько я помню, с ним проще работать.

Lokmaster
22.02.2013, 17:31
ну разве что поменять на это
this["StruiaB"+i]["Kaplia"].attachMovie("StruiaB", "K"+a, a);
но все равно в trace(StruiaB2.K5._y) получаю undefined

Hauts
22.02.2013, 17:37
attachMovie возвращает ссылку на созданный клип.

Я привык работать не со ссылками, соответствующими вложенности (типа "_root.baseContainer.gameLayout.backgrounds.background_1"), а с ссылками, соответствующими содержанию. То есть... Например:


this["StruiaB"+i]["Kaplia"].attachMovie("StruiaB", "K"+a, a);
this["StruiaB"+i]["Kaplia"]["K"+a]._rotation = 45


меняется на:

var struia = ...
var kaplia = stuia...
var someNewElement = kaplia.attachMovie(...


Кстати "я" транслитом будет "ya". И вообще лучше по-английски называть :)

Lokmaster
22.02.2013, 17:55
Мне нет смысла каждой Kaplia давать своё имя, они должны быть по 100шт. в 40 MovieClip и к ним как-то надо обращаться и они будут соответствовать координатам зависящим от расположения StruiB
возможно я не правильно определил вложенность, например так было бы правильнее
this["StruiaB"+i].attachMovie("StruiaB", "K"+a, a);
но получить координату мне не удается
trace(StruiaB2.K5._y)

Кстати, я так и не понимаю какая разница как называть MovieClip, если я знаю и помню по названию что он из себя представляет и все работает, даже если будет написан по-русски.

Hauts
22.02.2013, 18:08
Я не к тому, что нужно каждому клипу свое название, а к тому, что лучше использовать кэширование, так как точка — тоже оператор, требующий ресурсов. А динамический доступ — еще больше ресурсов.

Попробую объяснить:


_root.main.game.players.player_1

— 4 операции. Каждый раз обращаться по такой ссылке неприлично (ресурсоемко) и нехорошо выглядит в коде.

Динамический доступ к значениям еще более накладный. Не стоит усердствовать с [], как вы:

this["StruiaB"+i]._x = j*65/Math.pow(Math.pow(T, 2)+0.66015625, 0.5);
this["StruiaB"+i]._y = this["StruiaB"+i]._x*T;


Вообще, похоже, что динамический доступ нужен только для for..in.


var player = _root.main.game.players.player_1
player.goto(PLAYER_LOCATIONS.HOME)

— а здесь просто закэшировали ссылку. И при последующих вызовах, соответственно, будет только одна операция (то есть не будет происходить поиск этого "player"-а)

Если вы создаете переменный (для кэширования) внутри функции — они только там и будут существовать. То есть не стоит беспокоиться, что будет куча мусорных переменных (ссылок) в глобальной области видимости.

Мне нет смысла каждой Kaplia давай своё имя, они должны быть по 100шт.
— я про имена ничего не говорил. Только про ссылки.

но получить координату мне не удается

Трейсите все сомнительные строки, чтобы найти момент ошибки. Еще можете Ctrl + Shift + Enter нажать для того, чтобы протестировать с отладчиком (во флэше).

Кстати, я так и не понимаю какая разница как называть MovieClip, если я знаю и помню по названию что он из себя представляет и все работает, даже если будет написан по-русски.

Думаю, что это вопрос времени. Мне сейчас лень убеждать вас в обратном, но поверьте мне наслово — лучше с самого начала стараться по правилам писать, чем потом громко и неприлично ругаться, смотря в код.

Lokmaster
22.02.2013, 19:06
Как мне потом обращаться к каждому MovieClip "Kaplia", если там как минимум 2 переменных:
от 0 до 40 и от 1 до 100?

Добавлено через 3 минуты
Ладно, допустим изменю каждый клип под this["K"+i+j]
сути решения задачи нету

iNils
22.02.2013, 19:44
Как мне потом обращаться к каждому MovieClip "Kaplia", если там как минимум 2 переменных:
от 0 до 40 и от 1 до 100?А в чем проблема то? Я не понимаю.

Lokmaster
22.02.2013, 19:59
речь не об этом

iNils
22.02.2013, 20:04
А о чем?

Lokmaster
22.02.2013, 20:30
Не получается дублировать MovieClip внутри другого MovieClip

iNils
22.02.2013, 20:44
Вам же дали наводку - attachMovie.
duplicateMovieClip самый неудобный вариант.

Lokmaster
22.02.2013, 20:57
Так разве в duplicateMovieClip была проблема, т.е. с помощью duplicateMovieClip вторую входимость не сделать?

iNils
22.02.2013, 21:05
Нет, проблема в вашем коде. Просто с attachMovie код получается более чистым и решение полностью программное (не надо иметь объект дублирования на сцене, его всегда можно взять из библиотеки. При возможном редактировании это упрощает задачу. Нужно только код менять, без необходимости залезать в клип и менять там что-то)
Вы, вместо строкового имени капле, пытаетесь дать ей имя, которое является путем, который должен бы был привести к этой капле после ее создания:)
А надо так
this["StruiaB"+i]["Kaplia"].duplicateMovieClip(["K"+a],a);