PDA

Просмотр полной версии : MovieClipLoader, существуют ли указатели в as


oxid2
25.08.2006, 17:17
Привет,
пытаюсь создать флэшку с двумя клипами которые будут инициализироваться(из xml) и показываться по очереди.

Ссылки на клипы храняться в глобальных переменных _global.ActiveTemplate, _global.NextTemplate. когда приходит время показать новое окно, клип ActiveTemplate выгружается, а клип NextTemplate загружается.

Проблема возникла с использованием указателей(?) на клипы.
В методе onLoadInit, target указывает действительный клип(есть все методы и свойства), а _global.NextTemplate указывает на клип без свойств и методов.

Вопрос: cуществуют ли указатели или что то подобное в actionscript и что такое храниться в target и _global.NextTemplate если это не указатели?


....
....
onLoadInit: function( target:MovieClip ){
trace( "==>WindowListener onLoadInit" );
------->> //ссылки или указатели(?) равны, но свойства объектов разные
if( target == _global.NextTemplate ){
if( _global.ActiveTemplate != null){
_global.r.templateLoader.unloadClip(_global.ActiveTemplate);
};
trace( 'target=' +target );
trace( 'nextTemplate=' + _global.NextTemplate );

_global.ActiveTemplate = _global.NextTemplate;// = target;
initWindowChild( _global.NextTemplate, _global.NextWindowObj );
}
....
....

function loadWindow( windowId:String){
var windowObj = InitHelper.getWindowById( windowId );
_global.NextWindowObj = InitHelper.cloneWindow( windowObj );
//first initialization
if( _global.ActiveTemplate == null ){
_global.NextTemplate = _root.createEmptyMovieClip( "template1", _root.getNextHighestDepth());
}
else if( _global.ActiveTemplate == _root.template1 ){
_global.NextTemplate = _root.createEmptyMovieClip( "template2", _root.getNextHighestDepth());
}
else{
_global.NextTemplate = _root.createEmptyMovieClip( "template1", _root.getNextHighestDepth());
}

_root.templateLoader.loadClip( windowObj.path, _global.NextTemplate );
}

etc
25.08.2006, 17:20
onLoadInit:function -- что это?

Nirth
25.08.2006, 17:20
Под указателями ты имеешь ввиду делегаты из C#?

oxid2
25.08.2006, 17:32
Под указателями ты имеешь ввиду делегаты из C#?
нет делегаты это скорей указатели на функции

я имею ввиду ссылки на объекты, вот например когда ты делаешь

var p1 = new myObj();
var p2 = p1;

что храниться в p2?
ответ: указатель(ccылка) на объект myObj

так вот по идее в моём коде target и NextTemplate указывают на один и тот же объект, но у target есть свойства(разные контролы) а у NextTemplate этих свойств нет...

Nirth
25.08.2006, 17:36
ясно, и еще ты знаешь что код в первом посте у тебя не рабочий, по крайней мере первая часть синтактически не правильная.

Причина в принципе проста, дело в том что во время загрузки, твои мувики как бы пересоздаются ( с какой то точки зрения метод loadMovie,и MovieClipLoader.loadClip, можно расматривать как фабричный метод) и поэтому одна из сылок указывает на старый объект а другая на новый, но это все теории, если ты дашь рабочий код, можно будет разобратся на месте.

oxid2
25.08.2006, 17:52
ясно, и еще ты знаешь что код в первом посте у тебя не рабочий, по крайней мере первая часть синтактически не правильная.


Не рабочий это ясно, но полностью код я дать не могу.
Синтаксис правильный, я так создаю объект.

WindowListener = {

onLoadInit: function(target:MovieClip){
}
}

oxid2
25.08.2006, 17:57
одна из сылок указывает на старый объект а другая на новый, но это все теории, если ты дашь рабочий код, можно будет разобратся на месте.

В коде я ссылки(если это они) сравниваю и они равны!

Nirth
25.08.2006, 18:02
это

onLoadInit: function(target:MovieClip){
}

неправильный синтаксис....

etc
25.08.2006, 18:06
это

onLoadInit: function(target:MovieClip){
}

неправильный синтаксис....
Чем?
a = {b:function (c:Number) {
trace(c);
}};
a.b(10); // 10
работает. Только, естесственно, я никогда бы так не писал.

iNils
25.08.2006, 18:17
oxid2, прочитайте пункт 3 (остальные тоже почитайте для общего развития) правил подраздела http://www.flasher.ru/forum/showthread.php?t=79864

Nirth
25.08.2006, 18:19
хм не заметил фигурных скобок вокруг этого безобразия.


тоесть еще раз, у двух объектов свойства разные, но они проходят проверку сравнения? мм...у меня не получается с эмулировать такой ситуации

oxid2
25.08.2006, 18:33
oxid2, прочитайте пункт 3 [/url]
Прочитал, исправлюсь..

Сделал рабочую версию, единственное что требуется для тестирующих поправить это изменить пути в строках 51, 53 к любым двум клипам.

Кликаем на кнопку вверху и смотрим trace, после третьего щелчка, проблема начинает проявляться(т.е. после unloadClip), и cвойства перестают появляться хотя ссылки одинаковые.

oxid2
25.08.2006, 20:18
Люди, посмотрите пожалуста где тут собака порылась.

etc
25.08.2006, 20:22
Разобраться в таком коде невозможно.
Проще переписать заново, где будет меньше воды.

oxid2
25.08.2006, 20:39
Разобраться в таком коде невозможно.
в каком именно месте невозможно разобраться?

Проще переписать заново, где будет меньше воды.
В каком именно месте много воды?

Неужели можно в 55 строчках простого кода запутаться?

etc
25.08.2006, 20:44
Легко, потому что никакой чёткой логики там нет.
Поэтому проще переписать заново.

oxid2
25.08.2006, 21:08
Легко, потому что никакой чёткой логики там нет.


Где именно нет логики?
Это кусок моего кода, адаптированный для теста.

Что он делает? могу объяснить ещё раз, но ИМХО там понятно написанно

Скрипт по клику на кнопке загружает на сцену один из клипов(для тестов надо укзать пути к двум клипам на вашем компе), если на сцене уже есть клип, то он будет выгружен.

Nirth
25.08.2006, 21:10
я если честно тоже не понял логики кода, мне почему то кажется что если переписать, используя более дедовские способы, все заработает нормально

etc
25.08.2006, 21:15
oxid2, это можно описать гораздо короче.
target_mc = this.createEmptyMovieClip('target_mc',0);
currentScene = 0;
mcl = new MovieClipLoader();
mcl_lst = {};
mcl_lst.onLoadInit = function() {
trace('Scene #'+currentScene);
}
mcl_lst.onLoadError = function() {
trace('Load error');
}
mcl.addListener(mcl_lst);
myScenes = ['movie1.swf','movie2.swf'];
my_btn.onRelease = function() {
if (currentScenes<myScenes.length) {
currentScenes++;
mcl.loadClip(myScenes[currentScene],target_mc);
}
}

Логично?

oxid2
25.08.2006, 21:23
Ну не знаю что там не понятного,
WindowListener - это аналог статического объекта, можно наверное
и по другому как то писать, я обычно так делаю как в javascript.

MovieClipLoader - известный класс, для отслеживания загрузки.

Всё остальное проверка на то какое окно активное в данный момент.

А как дедовскими методами?

oxid2
25.08.2006, 21:42
Логично?
Нет, не логично.
Во первых у меня всегда меняются клипы, при каждом нажатии на кнопку, у тебя же показывается только второй клип.

Вобщем присутствуют как логические так и синтаксический ошибки.

etc
25.08.2006, 23:23
Нет, не логично.
Во первых у меня всегда меняются клипы, при каждом нажатии на кнопку, у тебя же показывается только второй клип.

Вобщем присутствуют как логические так и синтаксический ошибки.
Покажи мне хотя бы одну синтаксическую ошибку и хотя бы одну логическую, показывающую несоответствие логике:

Скрипт по клику на кнопке загружает на сцену один из клипов(для тестов надо укзать пути к двум клипам на вашем компе), если на сцене уже есть клип, то он будет выгружен.

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

oxid2
02.09.2006, 17:41
Покажи мне хотя бы одну синтаксическую ошибку и хотя бы одну логическую, показывающую несоответствие логике:

Ok, проще простого
target_mc = this.createEmptyMovieClip('target_mc',0);
currentScene = 0;
mcl = new MovieClipLoader();
mcl_lst = {};
mcl_lst.onLoadInit = function() {
trace('Scene #'+currentScene);
}
mcl_lst.onLoadError = function() {
trace('Load error');
}
mcl.addListener(mcl_lst);
myScenes = ['movie1.swf','movie2.swf'];
my_btn.onRelease = function() {
//переменной currentScenes нет, а есть currentScene (cинтаксическая ошибка)
if (currentScenes<myScenes.length) {
//инкрементировать надо после загрузки клипа, иначе мы некогда первый клип не увидим,
//а при втором нажатии на кнопку будем пытаться загрузить не существующий второй элемент массива
//(логическая ошибка)
currentScenes++;//<----------------здесь
mcl.loadClip(myScenes[currentScene],target_mc);
}
}


Прежде чем что-либо говорить об ошибках, нужно проверить и проверять свои слова.

Вот вот и я о том же.
Лучше перед тем как постить куски кода, проверь их на работоспособность и логичность.


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

Если нет желания чужой код читать, тогда уж лучше не отвечай что попало.

Ну про синтаксическую ошибку я выше сказал...

etc
02.09.2006, 17:46
Каждому человеку свойственно ошибаться.
Этот код я писал прямо в форме ответа и не проверял его на работоспособность.
Спасибо за найденные ошибки, возвращаю свои слова обратно.

з.Ы. Тем не менее, исправив ошибки, мой код будет гораздо проще.

silin
02.09.2006, 22:28
oxid2, если в твоем примере мувики пересоздавать на заранее отведенных и фиксированных глубинах, а не на getNextHighestDepth, то проблема снимается..
а сейчас получается что NextTemplate и target ссылаются на разные мувики, но на разных глубинах, но с одинаковыми именами ..
почему так получается я понять не сумел: грузим во вновь созданный, а в target onLoadInit передается старый, да еще и без свойств..

oxid2
03.09.2006, 20:27
silin,
интересно конечно, старый грузится без свойств по тому что он был наверное выгружен.
Так что такое хранится в target и NextTemplate? не указатель а просто путь к мувику что ли? вобщем не понятно.