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

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

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

Регистрация: Oct 2008
Сообщений: 4
Отправить сообщение для topinambur с помощью ICQ
Post Импорт 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);
	}
}
Перелопатил уже пол-интернета, но решения так и не нашел. Почему же оно через интерфейс все-таки не работает?


Последний раз редактировалось topinambur; 29.11.2008 в 20:48.
Старый 29.11.2008, 21:29
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Скомпилированные интерфейсы должны совпадать с точностью до описания в обоих swf.

Старый 03.12.2008, 12:04
topinambur вне форума Посмотреть профиль Отправить личное сообщение для topinambur Найти все сообщения от topinambur
  № 3  
Ответить с цитированием
topinambur

Регистрация: Oct 2008
Сообщений: 4
Отправить сообщение для topinambur с помощью ICQ
Спасибо, решил сравнить чем же отличаются два интерфейса и ошибка оказалась довольно банальной:

Flash cs: IGame.as:
Код AS3:
package {
 
    interface IGame{
        function hello():String;
    }
 
}
Flex 3: IGame.as:
Код AS3:
package {
    public interface IGame{
        function hello():String;
    }
}
т.е. один дексриптор пропустил

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

Регистрация: Sep 2002
Сообщений: 30,787
Правильно, потому что по умолчанию уровень доступа у методов (если не указано) — internal.

Старый 03.12.2008, 20:08
topinambur вне форума Посмотреть профиль Отправить личное сообщение для topinambur Найти все сообщения от topinambur
  № 5  
Ответить с цитированием
topinambur

Регистрация: Oct 2008
Сообщений: 4
Отправить сообщение для topinambur с помощью ICQ
Еще один небольшой вопрос, по смыслу наверное все-таки сюда

В загружаемом 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. Нашел интересный пост . Попробую завтра реализовать


Последний раз редактировалось topinambur; 03.12.2008 в 22:15.
Старый 07.04.2009, 17:25
ulu вне форума Посмотреть профиль Отправить личное сообщение для ulu Найти все сообщения от ulu
  № 6  
Ответить с цитированием
ulu

Регистрация: Apr 2009
Сообщений: 20
Почтеннейшие,

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

Помогите!

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

Регистрация: Sep 2002
Сообщений: 30,787
Значит не соблюдены условия из поста #2.

Старый 07.04.2009, 20:16
ulu вне форума Посмотреть профиль Отправить личное сообщение для ulu Найти все сообщения от ulu
  № 8  
Ответить с цитированием
ulu

Регистрация: Apr 2009
Сообщений: 20
Цитата:
Сообщение от __etc Посмотреть сообщение
Значит не соблюдены условия из поста #2.
Оба проекта (fla и mxml) ссылаются на один (физически) файл.

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

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

Регистрация: Sep 2002
Сообщений: 30,787
Нет, ничего плохого в этом нет, но если интерфейсы одинаковы, то значит content не реализует этот интерфейс.

Старый 07.04.2009, 20:39
ulu вне форума Посмотреть профиль Отправить личное сообщение для ulu Найти все сообщения от ulu
  № 10  
Ответить с цитированием
ulu

Регистрация: Apr 2009
Сообщений: 20
попробовал заказать ему описание, вот, что пишет:
Код:
<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, время: 01:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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