Форум 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)
-   -   Обращение к timeline внешнего swf (http://www.flasher.ru/forum/showthread.php?t=180523)

dkart01 04.06.2012 19:27

Обращение к timeline внешнего swf
 
Вложений: 1
Здравствуйте, есть 2 мувиклипа. (Приложены к теме)
1) А - главный
2) Б - зависимый, в котором 3 кадра.

Как можно управлять из ActionScript клипа А, проигрыванием, остановкой клипа Б.
Б подгружается в А через MovieClipLoader.

Например, в А написано

Код AS1/AS2:

_3dmodel.gotoAndStop(2);

Но клиб Б не останавливается.

mooncar 04.06.2012 19:32

1. Не называйте "мувиклипами" swf-ролики, мувиклип - это символ класса MovieClip.
2. Что такое "зависимый"? Может быть "загружаемый"?
3. Исходники в CS6 - это круто, но мало кто тут сможет их открыть и посмотреть, что там у вас. Сохраните максимум для CS5.
Или хотя бы приведите здесь полный код.

Могу предположить только, что вы, например, не дожидаетесь загрузки второго ролика, и выполняете gotoAndStop не из обработчика onLoadInit.

dkart01 05.06.2012 10:47

Вложений: 1
Спасибо за поправки.
Есть 2 swf, 001- главный, 002- загружаемый в 001.
Нужно в 001 написать команду, чтобы загружаемый в него 002 остановился на 2 кадре внутри себя.

Выложил в формате cs5 (меньше никак).

Код 001

Код AS1/AS2:

_root.createEmptyMovieClip("_3dmodel",-19000);
 
var myLoader:MovieClipLoader = new MovieClipLoader()// Подключаем клип
myLoader.addListener(this);
myLoader.loadClip("002.swf", _3dmodel);
 
_3dmodel.gotoAndStop(2);

Так же непонятная строчка

Код AS1/AS2:

myLoader.addListener(this);


mooncar 05.06.2012 12:02

"Также непонятная строчка" - в этом корень вашей неудачи. Это слушатель загрузки, который у вас сейчас остается без дела, хотя и добавлен в этой строке к загрузчику.
То есть он "узнает", что загрузка закончена, но у вас сейчас на это событие нет никакой реакции, поскольку нет обработчика этого события.
А только в этом случае можно оперировать загруженным контентом, поскольку код работает асинхронно по отношению к процессам загрузки.

Код AS1/AS2:

_root.createEmptyMovieClip('_3dmodel', -19000);
 
var myLoader:MovieClipLoader = new MovieClipLoader()// Создаем экземпляр загрузчика
 
//В общем случае в качестве слушателя создается отдельный объект.
//Мы же для экономии ресурсов в качестве слушателя используем текущий объект,
//(this тут - это ссылка  на _root, поскольку код у вас на главном таймлайне)
myLoader.addListener(this);
 
this.onLoadInit = function(tgt:MovieClip) //задаем для слушателя обработчик события загрузки
{
  tgt.gotoAndStop(2); //tgt - это аргумент ф-ии - ссылка на _3dmodel, куда загружаем
};
 
myLoader.loadClip('002.swf', _3dmodel); //приготовления закончены, загружаем

Еще вот что. Отрицательные глубины зарезервированы для объектов, создаваемых руками, используйте для программного создания объектов положительные глубины, начиная от 0 включительно.

dkart01 05.06.2012 16:49

Спасибо!

1) Всегда ли когда требуется обращение к кадру в swf нужно будет вызывать функцию onLoadInit из 4 строк
2) попробовал заменить "this" в addListener и.onLoadInit на другое имя и у меня переставало работать

mooncar 05.06.2012 22:05

Не жалейте строк в редакторе кода :) Компилятору все равно - он сделает байт-код, как ему лучше и понятнее.

onLoadInit - это название события, обработчик которого задается анонимной функцией в вышеприведенном мною коде.
Но я бы писал так в своем проекте:
Код AS1/AS2:

_root.createEmptyMovieClip('_3dmodel', 0);
 
var myLoader:MovieClipLoader = new MovieClipLoader();//создаем загрузчик
var lst:Object = new Object(); //тут в качетсве слушателя специальный объект
lst.onLoadInit = lstOnLoadInit;  //задаем для слушателя функцию - обработчик события загрузки
myLoader.addListener(lst); //слушатель будет слушать загрузчик myLoader
myLoader.loadClip('002.swf', _3dmodel); //а загрузичк - загружать что надо и куда надо :)
 
function lstOnLoadInit(tgt:MovieClip)
{
  tgt.gotoAndStop(2);
}
 
//В принципе можно написать и так:
/*
function lstOnLoadInit()
{
  _3dmodel.gotoAndStop(2);
}
*/

//Но первая запись, с аргументом tgt, более соответствует принципу универсальности
//и удобству в случаях переделок.

1. Все начальные действия с загруженным контентом нужно начинать из обработчика события загрузки. Перечитайте мой предыдущий пост и комментарии в коде.
2. Что значит на "другое имя"? Нужно не "другое имя", а объект-слушатель, который создаем, как я показал тут. В коде этого поста я создаю специальный объект-слушатель, как "по учебнику", а не использую текущий таймлайн (точнее, текущий объект, таймлайн - это понятие из IDE), как было в предыдущем посте в целях экономии ресурсов. this там ссылался на _root и сам _root слушал события.

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

dkart01 06.06.2012 12:41

Благодарю вас за подробный ответ и уделённое время.

mooncar, а электронный help от Adobe для вас был достаточен или вы использовали дополнительные учебные материалы, если использовали, можете поделиться названиями (ссылками на ресурсы).

mooncar 06.06.2012 15:04

Хелп + книга "Flash MX 2004. Action Script. Библия пользователя".
Только на нее не смотрите, изучайте AS3 по известной литературе (тема на форуме обсуждалась, новых тем не надо о литературе).


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

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