PDA

Просмотр полной версии : Затык с LoadMovie и адресациями...


WILD CAT
31.08.2006, 22:32
Ребят, нужна помощь. Ошибка, как всегда, лежит на поверхности, но я ее в упор не вижу.

Есть один *.swf файл (назовем ф1_1). В него нормально загружается другой свф (ф1_2 - он загружается с помощью LoadMovie непосредственно в мувиклип, который расположен на сцене ф1_1). И есть еще один файл ф1_3 который таким же гаком загружается в мувиклип, расположенный на сцене ф1_2. В ф1_2 есть мувиклип, который дублируется и именуется (дубликат) dplayer. Ему я вот этим кодом присваиваю значение targ="playa" и потом загружаю в него файл (назовем ф2).
duplicateMovieClip(dupl_box, "dplayer", this.getNextHighestDepth());
dplayer.targ= "playa";
loadMovie("data/models/players/1/code.swf", dplayer);

Ф2 имеет на первом кадре всего одну строку
_parent.map[targ].stop();
Теоретически эта строка должна останавливать анимацию мувиклипа, который находится на сцене ф1_3 и имя ему - playa.
Дело как раз в том, что не останавливает.
Если вместо [targ] поставить .playa то все работает. Значение targ в трейсе ф2 пишется undefined. Но координаты ф2 меняются спокойно.
Помогите плиз!

WILD CAT
31.08.2006, 23:26
Или stop не работает с динамической адресацией?

WILD CAT
31.08.2006, 23:30
Хотя нет...
targ="playa";
_parent.map[targ].stop();
Так то работает...

wvxvw
01.09.2006, 00:12
Из всего написанного не понятно почему присвоив dplayer.targ какое-то значение ты ждешь, что то же значение будет и у targ в любом месте откуда ни обратись...

WILD CAT
01.09.2006, 00:17
Я присваиваю значение targ только что отдублированному мувиклипу dplayer. Потом я в dplayer загружаю *.swf файл с кодом на первом кадре, который по идее должен использовать это значение нормально, вот и все... если я правильно понял вашу мысль.

wvxvw
01.09.2006, 02:31
var _l1:MovieClip = _root.attachMovie("holder_01", "h_mc", 0);
_l1.b_txt.text = "stopped";
_l1._targ = "h_mc";
_l1.stop();
var _l2:MovieClip = _l1.duplicateMovieClip("h1_mc", 5, {_targ:"h1_mc", _x:200});
_l2.b_txt.text = "unstopable";
var _l3:MovieClip = _root.attachMovie("bt", "b_mc", 10, {_x:150, _y:200});
_l3.onRelease = function(){
var _l1:MovieClip = _root._l2.createEmptyMovieClip("tgt", 15);
_l1.loadMovie("test.swf");
_l1._x = _l1._parent._width;
_l1._y = _l1._parent._height;
_l1._parent.onRelease = function(){
trace(this["_targ"]+" "+this._parent._l1["_targ"]);
this._parent[this["_targ"]].stop();
this._parent[this["_targ"]].b_txt.text = "stopped";
this._parent[this._parent._l1["_targ"]].play();
this._parent[this._parent._l1["_targ"]].b_txt.text = "unstopable";
}
}
Всяко извращался, - ничего с переменными не происходит, где были заданы, там и остались... %)

WILD CAT
01.09.2006, 03:14
Да честно говоря я уже много раз использовал сий финт, но сейчас просто нечто. Вообще даже идей нету почему оно так. Ну просто нету.

WILD CAT
01.09.2006, 20:36
Самое глюкное, что вот так не работает (принимает):
dplayer.targ= "playa";
А вот так работает
dplayer._x= 50;

wvxvw
03.09.2006, 00:54
да нет, ты просто присваиваешь в одном месте, а спрашиваешь в другом, вот упрощенный пример твоей ошибки:

my_mc._myProp = "My Property";
trace(my_mc[_myProp]); //undefined;
Потому что значение переменной внутри квадратных скобок не было определено в том месте откуда делается вызов.
Если сделаешь так:

my_mc._myProp = "My Property";
trace(my_mc["_myProp"]); //My Property;

То значение прочитается, т.как понятно, что ты передаешь значение, а не пытаешся подставить значение пустой (несуществующей переменной).

WILD CAT
03.09.2006, 02:53
Я не думаю, что ошибка в этом, ибо я проверил уже всеми известными мне способами. И пришел к якобывыводу, что дело в некой фиче duplicate. Пришлось данный лаг обходить. В подтверждение скажу, что если dplayer.targ="playa" забить в enterframe то все прекрасно работает. Другой вопрос, что enterframe мне в общем то не нужен, ну да ладно. Каким гаком я обошел сказать не могу, ибо тогда рубанули свет и ничего не сохранилось...
100% адресация и синтаксис (типа как в примере выше) у меня правильные, ведь с энтерфрамом работает все толково и как надо... убицца в первый раз встречаюсь с таким, учитывая, что я ужо неоднократно использовал это св-во.

wvxvw
03.09.2006, 05:52
Ок, объясню почему работало с энтерфреймом. Очевидно в этой функции ты определял значение твоей переменной _в том месте откуда ты к ней обращаешся_.
Во всех остальных примерах ты обращаешся к свойству имени которого ты _не знаешь_.
Пример еще раз:
var targ;
trace(targ); // undefined *Значение переменной не присвоено (ты ее даже не объявляешь)*
my_mc.targ = "";
trace(my_mc[targ]); // undefined *Ессесна, ты пытаешься обратиться к
// свойству клипа по имени 'undefined', но у клипа нет такого свойства,
// поэтому результатом снова будет 'undefined'*
trace(my_mc["targ"]); // "" *Наконец-то ты обращаешься к свойству,
// которое ты определил раньше*

WILD CAT
03.09.2006, 15:17
trace(my_mc["targ"]);
Если мне не изменяет память, то ответ этого трейса будет "targ".
Если так, то это не то что мне нужно. Мне то нужно, чтобы например значение targ было бы равно "playa". А потом кодом my_mc[targ] получилась адресация my_mc.playa

***Чуть позже***
Опс - нет я был не прав... момент

WILD CAT
03.09.2006, 15:36
Хм... нет, секунду, все правильно... за исключением
Если мне не изменяет память, то ответ этого трейса будет "targ".
У меня должна получится вышеозначенная адресация. Если бы весь код был в одном кадре, то все бы работало, а так у меня значение присваивается только что отдублированному клипу.
К тому же если у меня значение targ="playa", то адресация my_mc["targ"] даст адрес my_mc.targ
А если my_mc[targ], то адрес будет my_mc.playa, что мне и нужно.
Я наверное туп и не вижу решения в вашем варианте, но я его понял, это точно. Наперед скажу спасибо, но вопрос для остается открытым.

wvxvw
03.09.2006, 16:36
Если мне не изменяет память,
Это очень печально, но память тебе все-таки изменяет, значение "targ" переменной targ нигде и ни разу не присваивалось... Именно поэтому трейс ну никак не сможет выдать такой ответ.
Чтобы трейс вывел имя переменной

my_mc.targ="blah-blah";
for(i in my_mc){
trace(i+", "+my_mc[i]); // Выводит 'targ, blah-blah'
}

Ты упорно продолжаешь путать имя переменной с ее значением.
Чтобы обратится к свойству объекта через оператор [] нужно в качестве параметра передать Стринг. Не важно определишь ли ты значение этого стринга до обращения или непосредственно в момент обращения.
Т.е.

my_mc.targ = "abcd";
var my_arr:Array = my_mc.targ.split("");
trace(my_mc[my_arr[0] + my_arr[1] + my_arr[2] + my_arr[3]]); // Выводит abcd

Правильно

my_mc.targ = "abcd";
trace(this[targ]); // undefined *my_mc!=this !!!*

Не правильно

И вообще, лучше дай исходник, а то так чет очень тяжко как-то =)

WILD CAT
03.09.2006, 19:16
Я б с удовольствием дал, но то что я наделал там, состоит из кучи файлов... придется передавать все, а этого не получится.
Я прекрасно понимаю примеры, которые вы приводите, и понимаю что там правильно, а что нет.
Тем более, что значение targ уменя определяется, но в другом файле, а теоретически приниматься оно должно другим файлом, загруженным в мувиклип.