Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Импорт SWF во FLEX, совместное использование функций (http://www.flasher.ru/forum/showthread.php?t=118632)

topinambur 29.11.2008 18:22

Импорт SWF во FLEX, совместное использование функций
 
Здравствуйте

У меня возникла задача вставлять SWF на CS3 в флекс-приложение, вызывать функции SWF.

Написал простейший макет.

SWF часть:

Файл Game.as
Код AS3:

package {
        import flash.display.MovieClip;
 
        public class Game extends MovieClip implements IGame {
                public function hello():String {
                        return "Hello, world!";
                }
        }       
 
}

Файл IGame.as
Код AS3:

package {
 
        interface IGame{
                function hello():String;
        }
 
}


Флекс часть:

Загрузка SWF:
Код AS3:

 
private function loadSWF():void{
        loader = new Loader();
              var req:URLRequest = new URLRequest("http://localhost/swf/GameFrame/bin-debug/Game.swf");
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadSWFComplete);
        loader.load(req);
}

И обработчик успешной загрузки:

Вот так работает:
Код AS3:

private function loadSWFComplete( event:Event ):void{
        var info:LoaderInfo = event.target as LoaderInfo;
        var str:String = info.content['hello']();
        Alert.show(str);
}

А через интерфейс почему-то нет:
Код AS3:

private function loadSWFComplete( event:Event ):void{
        var info:LoaderInfo = event.target as LoaderInfo;
        var loadable:IGame = info.content as IGame;
        if(loadable){
                var str:String = loadable.hello();
                Alert.show(str);
        }
}

Перелопатил уже пол-интернета, но решения так и не нашел. Почему же оно через интерфейс все-таки не работает?

etc 29.11.2008 21:29

Скомпилированные интерфейсы должны совпадать с точностью до описания в обоих swf.

topinambur 03.12.2008 12:04

Спасибо, решил сравнить чем же отличаются два интерфейса и ошибка оказалась довольно банальной:

Flash cs: IGame.as:
Код AS3:

package {
 
    interface IGame{
        function hello():String;
    }
 
}

Flex 3: IGame.as:
Код AS3:

package {
    public interface IGame{
        function hello():String;
    }
}

т.е. один дексриптор пропустил :)

etc 03.12.2008 12:48

Правильно, потому что по умолчанию уровень доступа у методов (если не указано) — internal.

topinambur 03.12.2008 20:08

Еще один небольшой вопрос, по смыслу наверное все-таки сюда

В загружаемом swf (Flash CS3) я генерирую в случайные моменты времени событие:
Код AS3:

this.loaderInfo.sharedEvents.dispatchEvent( new Event('someEvent') );

И хочу обрабатывать их соответственно в главном фрейме (приложении на Flex 3):

Код AS3:

private function loadSWF():void{
loader = new Loader();
var req:URLRequest = new URLRequest("game.swf");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadSWFComplete);
loader.contentLoaderInfo.sharedEvents.addEventListener('someEvent', onRefresh);
loader.load(req);
}

Почему-то onRefresh не срабатывает


P.S. Нашел интересный пост . Попробую завтра реализовать

ulu 07.04.2009 17:25

Почтеннейшие,

у меня та же история, что и в первом примере. Только у меня интерфейсы IGame совпадают (это один и тот же файл). Картина та же --
Код AS3:

info.content['hello']()

работает,
Код AS3:

info.content as IGame

выдает нул.

Помогите!

etc 07.04.2009 18:55

Значит не соблюдены условия из поста #2.

ulu 07.04.2009 20:16

Цитата:

Сообщение от __etc (Сообщение 811594)
Значит не соблюдены условия из поста #2.

Оба проекта (fla и mxml) ссылаются на один (физически) файл.

Кстати, а это плохо?

etc 07.04.2009 20:22

Нет, ничего плохого в этом нет, но если интерфейсы одинаковы, то значит content не реализует этот интерфейс.

ulu 07.04.2009 20:39

попробовал заказать ему описание, вот, что пишет:
Код:

<type name="Game" base="flash.display::MovieClip" isDynamic="false" isFinal="false" isStatic="false">
  <extendsClass type="flash.display::MovieClip"/>
  <extendsClass type="flash.display::Sprite"/>
  <extendsClass type="flash.display::DisplayObjectContainer"/>
  <extendsClass type="flash.display::InteractiveObject"/>
  <extendsClass type="flash.display::DisplayObject"/>
  <extendsClass type="flash.events::EventDispatcher"/>
  <extendsClass type="Object"/>
  <implementsInterface type="flash.events::IEventDispatcher"/>
  <implementsInterface type="IGame"/>
  <implementsInterface type="flash.display::IBitmapDrawable"/>
  <method name="hello" declaredBy="Game" returnType="String"/>
...

То есть, IGame он реализует..


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

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