![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Это не вопрос, это ответ
В ActionScript 3.0 появилась возможность, которую очень давно ждали, возможность загрузить произвольный swf-файл и приаттачить в произвольное место мувик из библиотеки (library) этого файла. Возможность-то появилась, вот только метод совсем не очевидный, я провозился больше часа, пока получилось, а в инете нормального примера не нашел. Потому и публикую пример для потомков.1. Создаем новый flash document под названием "avatars.fla" 2. Создаем в библиотеке новый мквиклип, назовем его "avatar", ставим галочки "Export for ActionScript" и "Export in first frame". Рисуем в мувике что-нибудь жизнеутверждающее ![]() 3. Компилим нашу библиотеку, получаем avatars.swf. Теперь задача добыть из этого файла мувик "avatar". 4. Создаем новый flash document под уже привычным названием Test.fla 5. Ставим Document class = Test 6. Пишем следующий скрипт Test.as: package {
import flash.display.Sprite;
import flash.display.Loader; // загрузчик
import flash.display.LoaderInfo; // инфа о загруженном контенте
import flash.net.URLRequest; // для создания URL
import flash.events.*; // всякие события
public class Test extends Sprite {
// конструктор
public function Test() {
// создаем загрузчик
var loader:Loader = new Loader();
// слушаем события о процессе загрузки
// обратите внимание, нужно добавлять listeners не к
// loader а к loader.contentLoaderInfo !
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
// начинаем загрузку файла "avatars.swf"
loader.load(new URLRequest("avatars.swf"));
}
// загрузка завершена
private function completeHandler(event:Event):void {
// получим инфу о загруженном контенте
var info:LoaderInfo = event.target as LoaderInfo;
// выведем URL загруженного файла для теста
trace("Ok loaded: " + info.url);
// пробуем достать нужный нам мувиклип
// делаем это в блоке try+catch, т.к. нужного
// нам мувика там может и не быть (теоретически)
try {
// получаем ссылку на класс нужного мувика
// используя LoaderInfo.applicationDomain.getDefinition
var a:Class = info.applicationDomain.getDefinition("avatar");
// создаем мувик и сразу аттачим к себе
addChild( new a() );
} catch (e:ReferenceError) {
// напишем об ошибке, что нужный мувиклип не найден
trace('ERROR: '+e);
}
}
// при загрузке файла произошла какая-то ошибка
private function ioErrorHandler(event:IOErrorEvent):void {
trace("ERROR: " + event);
}
}
}
Одна деталь, так можно аттачить только мувиклипы из AS3, если загруженный .swf файл будет версии AS2 или 1, то ничего не получится. Этот пример в аттаче. |
|
|||||
|
Ага делал что-то подобное, только без applicationDomain.getDefinition не знал, зачем это и как это работает. Просто писал функцию в корневом классе, которая возвращала ссылку на класс внутри .swf файла.
что-то типа |
|
|||||
|
[+2 20.11.06]
[+2 23.11.06] Регистрация: Oct 2006
Сообщений: 92
|
Если во flex создать as приложение, то он ругается на эту строчку.
Ошибка: Implicit coercion of a value with static type Object to a possibly unrelated type Class. Последний раз редактировалось Aleksey123; 25.11.2006 в 16:00. |
|
|||||
|
Давай код класса avatar
|
|
|||||
|
[+2 20.11.06]
[+2 23.11.06] Регистрация: Oct 2006
Сообщений: 92
|
Использую твой avatar.swf
А во flex выбираю actionscript project |
|
|||||
|
Цитата:
Тебе нужно объявить класс. Давай исходник avatar |
|
|||||
|
[+2 20.11.06]
[+2 23.11.06] Регистрация: Oct 2006
Сообщений: 92
|
Я не менял ничего в исходнике, просто хочу чтобы во flex то же самое сработало а когда вставляю код test.as он пишет ошибку про которую уже написал выше. Не понимаю что за класс еще писать надо.
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Навскидку, а кастить в Class не надо?
|
|
|||||
|
я делаю это так. допустим есть fla файл в котором все мувики лежат в библиотеке. допустим у меня есть мувик с названием movie1. компилим эту библиотеку.
дальше у меня есть какой нибудь класс под названием class1 наследованный от Sprite. я не хочу использовать Flash 9 так как глючное создание и медленное, поэтому я использую Flex AS Project. но внедрить то муувик из библиотеки мне нужно. ок! берем хелп по AS и находим мета тег Embed.. то что доктор прописал. итог такой: вот собственно и все... |
|
|||||
|
а по поводу getDefinitionByName то работать будет только если у вас уже есть экземпляр класса... это макромедийцы недоглядели...
|
![]() |
![]() |
Часовой пояс GMT +4, время: 17:48. |
|
|
« Предыдущая тема | Следующая тема » |
|
|