Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   MovieClipLoader, существуют ли указатели в as (http://www.flasher.ru/forum/showthread.php?t=84205)

oxid2 25.08.2006 17:17

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 );
}


etc 25.08.2006 17:20

onLoadInit:function -- что это?

Nirth 25.08.2006 17:20

Под указателями ты имеешь ввиду делегаты из C#?

oxid2 25.08.2006 17:32

Цитата:

Сообщение от Nirth
Под указателями ты имеешь ввиду делегаты из 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

Цитата:

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

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

Код:

WindowListener = {

 onLoadInit: function(target:MovieClip){
}
}


oxid2 25.08.2006 17:57

Цитата:

Сообщение от Nirth
одна из сылок указывает на старый объект а другая на новый, но это все теории, если ты дашь рабочий код, можно будет разобратся на месте.

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

Nirth 25.08.2006 18:02

это
Код:

onLoadInit: function(target:MovieClip){
}

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

etc 25.08.2006 18:06

Цитата:

Сообщение от Nirth
это
Код:

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

Вложений: 1
Цитата:

Сообщение от iNils
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

Цитата:

Сообщение от __etc
Разобраться в таком коде невозможно.

в каком именно месте невозможно разобраться?

Цитата:

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

В каком именно месте много воды?

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

etc 25.08.2006 20:44

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

oxid2 25.08.2006 21:08

Цитата:

Сообщение от __etc
Легко, потому что никакой чёткой логики там нет.

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

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

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

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
Логично?

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

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

etc 25.08.2006 23:23

Цитата:

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

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

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

Цитата:

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

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

oxid2 02.09.2006 17:41

Цитата:

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

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? не указатель а просто путь к мувику что ли? вобщем не понятно.


Часовой пояс GMT +4, время: 19:15.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.