Просмотр полной версии : MovieClipLoader, существуют ли указатели в as
Привет,
пытаюсь создать флэшку с двумя клипами которые будут инициализироваться(из 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 );
}
onLoadInit:function -- что это?
Под указателями ты имеешь ввиду делегаты из C#?
Под указателями ты имеешь ввиду делегаты из C#?
нет делегаты это скорей указатели на функции
я имею ввиду ссылки на объекты, вот например когда ты делаешь
var p1 = new myObj();
var p2 = p1;
что храниться в p2?
ответ: указатель(ccылка) на объект myObj
так вот по идее в моём коде target и NextTemplate указывают на один и тот же объект, но у target есть свойства(разные контролы) а у NextTemplate этих свойств нет...
ясно, и еще ты знаешь что код в первом посте у тебя не рабочий, по крайней мере первая часть синтактически не правильная.
Причина в принципе проста, дело в том что во время загрузки, твои мувики как бы пересоздаются ( с какой то точки зрения метод loadMovie,и MovieClipLoader.loadClip, можно расматривать как фабричный метод) и поэтому одна из сылок указывает на старый объект а другая на новый, но это все теории, если ты дашь рабочий код, можно будет разобратся на месте.
ясно, и еще ты знаешь что код в первом посте у тебя не рабочий, по крайней мере первая часть синтактически не правильная.
Не рабочий это ясно, но полностью код я дать не могу.
Синтаксис правильный, я так создаю объект.
WindowListener = {
onLoadInit: function(target:MovieClip){
}
}
одна из сылок указывает на старый объект а другая на новый, но это все теории, если ты дашь рабочий код, можно будет разобратся на месте.
В коде я ссылки(если это они) сравниваю и они равны!
это
onLoadInit: function(target:MovieClip){
}
неправильный синтаксис....
это
onLoadInit: function(target:MovieClip){
}
неправильный синтаксис....
Чем?
a = {b:function (c:Number) {
trace(c);
}};
a.b(10); // 10
работает. Только, естесственно, я никогда бы так не писал.
oxid2, прочитайте пункт 3 (остальные тоже почитайте для общего развития) правил подраздела http://www.flasher.ru/forum/showthread.php?t=79864
хм не заметил фигурных скобок вокруг этого безобразия.
тоесть еще раз, у двух объектов свойства разные, но они проходят проверку сравнения? мм...у меня не получается с эмулировать такой ситуации
oxid2, прочитайте пункт 3 [/url]
Прочитал, исправлюсь..
Сделал рабочую версию, единственное что требуется для тестирующих поправить это изменить пути в строках 51, 53 к любым двум клипам.
Кликаем на кнопку вверху и смотрим trace, после третьего щелчка, проблема начинает проявляться(т.е. после unloadClip), и cвойства перестают появляться хотя ссылки одинаковые.
Люди, посмотрите пожалуста где тут собака порылась.
Разобраться в таком коде невозможно.
Проще переписать заново, где будет меньше воды.
Разобраться в таком коде невозможно.
в каком именно месте невозможно разобраться?
Проще переписать заново, где будет меньше воды.
В каком именно месте много воды?
Неужели можно в 55 строчках простого кода запутаться?
Легко, потому что никакой чёткой логики там нет.
Поэтому проще переписать заново.
Легко, потому что никакой чёткой логики там нет.
Где именно нет логики?
Это кусок моего кода, адаптированный для теста.
Что он делает? могу объяснить ещё раз, но ИМХО там понятно написанно
Скрипт по клику на кнопке загружает на сцену один из клипов(для тестов надо укзать пути к двум клипам на вашем компе), если на сцене уже есть клип, то он будет выгружен.
я если честно тоже не понял логики кода, мне почему то кажется что если переписать, используя более дедовские способы, все заработает нормально
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);
}
}
Логично?
Ну не знаю что там не понятного,
WindowListener - это аналог статического объекта, можно наверное
и по другому как то писать, я обычно так делаю как в javascript.
MovieClipLoader - известный класс, для отслеживания загрузки.
Всё остальное проверка на то какое окно активное в данный момент.
А как дедовскими методами?
Логично?
Нет, не логично.
Во первых у меня всегда меняются клипы, при каждом нажатии на кнопку, у тебя же показывается только второй клип.
Вобщем присутствуют как логические так и синтаксический ошибки.
Нет, не логично.
Во первых у меня всегда меняются клипы, при каждом нажатии на кнопку, у тебя же показывается только второй клип.
Вобщем присутствуют как логические так и синтаксический ошибки.
Покажи мне хотя бы одну синтаксическую ошибку и хотя бы одну логическую, показывающую несоответствие логике:
Скрипт по клику на кнопке загружает на сцену один из клипов(для тестов надо укзать пути к двум клипам на вашем компе), если на сцене уже есть клип, то он будет выгружен.
Прежде чем что-либо говорить об ошибках, нужно проверить и проверять свои слова. Дополнительная логика тобой указана не была, а что такое синтаксическая ошибка, судя по всему, понятие отсутствует.
Покажи мне хотя бы одну синтаксическую ошибку и хотя бы одну логическую, показывающую несоответствие логике:
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);
}
}
Прежде чем что-либо говорить об ошибках, нужно проверить и проверять свои слова.
Вот вот и я о том же.
Лучше перед тем как постить куски кода, проверь их на работоспособность и логичность.
Дополнительная логика тобой указана не была, а что такое синтаксическая ошибка, судя по всему, понятие отсутствует.
Если нет желания чужой код читать, тогда уж лучше не отвечай что попало.
Ну про синтаксическую ошибку я выше сказал...
Каждому человеку свойственно ошибаться.
Этот код я писал прямо в форме ответа и не проверял его на работоспособность.
Спасибо за найденные ошибки, возвращаю свои слова обратно.
з.Ы. Тем не менее, исправив ошибки, мой код будет гораздо проще.
oxid2, если в твоем примере мувики пересоздавать на заранее отведенных и фиксированных глубинах, а не на getNextHighestDepth, то проблема снимается..
а сейчас получается что NextTemplate и target ссылаются на разные мувики, но на разных глубинах, но с одинаковыми именами ..
почему так получается я понять не сумел: грузим во вновь созданный, а в target onLoadInit передается старый, да еще и без свойств..
silin,
интересно конечно, старый грузится без свойств по тому что он был наверное выгружен.
Так что такое хранится в target и NextTemplate? не указатель а просто путь к мувику что ли? вобщем не понятно.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.