Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.10.2006, 22:10
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 1  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию [*ОТВЕТ*]Аттач мувика из внешнего swf-файла

Это не вопрос, это ответ В 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);
        }
    }
}
7. Все подробно прокомментировано. Осталось запустить Test.fla и проверить результат.

Одна деталь, так можно аттачить только мувиклипы из AS3, если загруженный .swf файл будет версии AS2 или 1, то ничего не получится.

Этот пример в аттаче.
Вложения
Тип файла: zip attach_avatar_AS3.zip (11.4 Кб, 360 просмотров)
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 05.10.2006, 23:28
miramax вне форума Посмотреть профиль Отправить личное сообщение для miramax Посетить домашнюю страницу miramax Найти все сообщения от miramax
  № 2  
Ответить с цитированием
miramax
 
Аватар для miramax

Регистрация: Oct 2005
Адрес: Борисоглебск
Сообщений: 1,702
Отправить сообщение для miramax с помощью ICQ Отправить сообщение для miramax с помощью AIM Отправить сообщение для miramax с помощью MSN Отправить сообщение для miramax с помощью Yahoo Отправить сообщение для miramax с помощью Skype™
Ага делал что-то подобное, только без applicationDomain.getDefinition не знал, зачем это и как это работает. Просто писал функцию в корневом классе, которая возвращала ссылку на класс внутри .swf файла.
что-то типа
Код:
function (className:String):Class
{
return getDefinitionByName(className) as Class
}
__________________
AS3 | www.FLAPS.ru | Русские флэшеры самые умные флэшеры в мире. ©

Старый 25.11.2006, 15:10
Aleksey123 вне форума Посмотреть профиль Отправить личное сообщение для Aleksey123 Найти все сообщения от Aleksey123
  № 3  
Ответить с цитированием
Aleksey123
[+2 20.11.06]
[+2 23.11.06]

Регистрация: Oct 2006
Сообщений: 92
Если во flex создать as приложение, то он ругается на эту строчку.
Код:
var a:Class = info.applicationDomain.getDefinition("avatar");
Ошибка: Implicit coercion of a value with static type Object to a possibly unrelated type Class.


Последний раз редактировалось Aleksey123; 25.11.2006 в 16:00.
Старый 25.11.2006, 16:48
miramax вне форума Посмотреть профиль Отправить личное сообщение для miramax Посетить домашнюю страницу miramax Найти все сообщения от miramax
  № 4  
Ответить с цитированием
miramax
 
Аватар для miramax

Регистрация: Oct 2005
Адрес: Борисоглебск
Сообщений: 1,702
Отправить сообщение для miramax с помощью ICQ Отправить сообщение для miramax с помощью AIM Отправить сообщение для miramax с помощью MSN Отправить сообщение для miramax с помощью Yahoo Отправить сообщение для miramax с помощью Skype™
Цитата:
Сообщение от Aleksey123
Если во flex создать as приложение, то он ругается на эту строчку.
Код:
var a:Class = info.applicationDomain.getDefinition("avatar");
Ошибка: Implicit coercion of a value with static type Object to a possibly unrelated type Class.
Давай код класса avatar
__________________
AS3 | www.FLAPS.ru | Русские флэшеры самые умные флэшеры в мире. ©

Старый 25.11.2006, 17:13
Aleksey123 вне форума Посмотреть профиль Отправить личное сообщение для Aleksey123 Найти все сообщения от Aleksey123
  № 5  
Ответить с цитированием
Aleksey123
[+2 20.11.06]
[+2 23.11.06]

Регистрация: Oct 2006
Сообщений: 92
Использую твой avatar.swf
А во flex выбираю actionscript project

Старый 25.11.2006, 23:35
miramax вне форума Посмотреть профиль Отправить личное сообщение для miramax Посетить домашнюю страницу miramax Найти все сообщения от miramax
  № 6  
Ответить с цитированием
miramax
 
Аватар для miramax

Регистрация: Oct 2005
Адрес: Борисоглебск
Сообщений: 1,702
Отправить сообщение для miramax с помощью ICQ Отправить сообщение для miramax с помощью AIM Отправить сообщение для miramax с помощью MSN Отправить сообщение для miramax с помощью Yahoo Отправить сообщение для miramax с помощью Skype™
Цитата:
2. Создаем в библиотеке новый мквиклип, назовем его "avatar", ставим галочки "Export for ActionScript" и "Export in first frame". Рисуем в мувике что-нибудь жизнеутверждающее
Это сделал ?
Тебе нужно объявить класс.
Давай исходник avatar
__________________
AS3 | www.FLAPS.ru | Русские флэшеры самые умные флэшеры в мире. ©

Старый 25.11.2006, 23:56
Aleksey123 вне форума Посмотреть профиль Отправить личное сообщение для Aleksey123 Найти все сообщения от Aleksey123
  № 7  
Ответить с цитированием
Aleksey123
[+2 20.11.06]
[+2 23.11.06]

Регистрация: Oct 2006
Сообщений: 92
Я не менял ничего в исходнике, просто хочу чтобы во flex то же самое сработало а когда вставляю код test.as он пишет ошибку про которую уже написал выше. Не понимаю что за класс еще писать надо.

Старый 25.11.2006, 23:58
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Навскидку, а кастить в Class не надо?

Старый 14.12.2006, 14:58
kozloffsky вне форума Посмотреть профиль Отправить личное сообщение для kozloffsky Найти все сообщения от kozloffsky
  № 9  
Ответить с цитированием
kozloffsky

Регистрация: Dec 2006
Адрес: Ukrane
Сообщений: 6
Отправить сообщение для kozloffsky с помощью ICQ
По умолчанию Внедряем мувики

я делаю это так. допустим есть fla файл в котором все мувики лежат в библиотеке. допустим у меня есть мувик с названием movie1. компилим эту библиотеку.

дальше у меня есть какой нибудь класс под названием class1 наследованный от Sprite. я не хочу использовать Flash 9 так как глючное создание и медленное, поэтому я использую Flex AS Project. но внедрить то муувик из библиотеки мне нужно. ок! берем хелп по AS и находим мета тег Embed.. то что доктор прописал. итог такой:
Код:
class class1 extends Sprite{

   [Embed(source="/libruary.swf", symbol="movie1")]
    public var mcClass:Class;
    public var mc:MovieClip;
    
     public function class class1(){
        mc= new mcClass();
        addChild(mc);
     }

}
вот собственно и все...

Старый 14.12.2006, 15:01
kozloffsky вне форума Посмотреть профиль Отправить личное сообщение для kozloffsky Найти все сообщения от kozloffsky
  № 10  
Ответить с цитированием
kozloffsky

Регистрация: Dec 2006
Адрес: Ukrane
Сообщений: 6
Отправить сообщение для kozloffsky с помощью ICQ
а по поводу getDefinitionByName то работать будет только если у вас уже есть экземпляр класса... это макромедийцы недоглядели...

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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