Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как привести загруженный контент к интерфейсу (http://www.flasher.ru/forum/showthread.php?t=122158)

litebox 03.03.2009 20:07

Как привести загруженный контент к интерфейсу
 
Вложений: 2
Всем привет. Столкнулся с такой проблемой: при попытке привести загруженный контент с document class BingoGame к интерфейсу IBingoGame методом
Код AS3:

var game:IBingoGame = (loader.content as IBingoGame)

в переменную попадает null, при попытке привести методом
Код AS3:

var game:IBingoGame = IBingoGame(loader.content)

возникает ошибка
Код:

TypeError: Error #1034: Type Coercion failed: cannot convert bingo.game::BingoGame@1bfdb0b1 to bingo.interfaces.IBingoGame.
        at bingo.shell::TabContent/::eventDownloadComplete()

при этом, если обратится к загруженному контенту так:
Код AS3:

(loader.content as MovieClip).activate(true);

то public функция activate, которая описана в интерфейсе, прекрасно вызывается.
Для наглядности привожу структуру зависимостей классов проекта (а может она вовсе не наглядная, но я старался :)):
Вложение 21699

Вообще смутили меня две вещи:
1. Если загрузить игру в главную флэшку (в Shell), то она прекрасно приводится к своему интерфейсу.
2. Если в лоадере написать:
Код AS3:

IBingoGame(loader.content);

то в дальнейшем, когда лоадер отдаст классу TabContent указатель на loader.content - в нем можно будет без проблем привести контент к интерфейсу игры - этот момент вообще похож на шаманство.
Лоадер загружается в главную флэшку shell один раз, затем из него берется класс LoaderBar и в дальнейшем, при с создании нового таба, создается экземпляр этого класса.
Прикрепляю файл с рисунком-схемой в zip-архиве, т.к. вложенный рисунок стал каким-то маленьким и неудобочитаемым

insected 03.03.2009 20:34

А где в IBingoGame функция activate ? И по-моему Вы путаете диаграмму классов с чем то еще...

BlooDHounD 03.03.2009 20:40

Код AS3:

class BingoGame implements IBingoGame {


Anry_coolboy 03.03.2009 21:21

litebox сложновато описал проблему...

дело в том, что если загрузить clip1.swf, а потом в clip1.swf загрузить clip2.swf, то при при поптыке привести символы в clip2.swf к интерфесу, возвращается null

litebox 04.03.2009 11:18

insected - с UML я знаком совсем немножко - просто лень было рисовать взаимодействие в Word'е или Illustrator'е - так что за неграматную диаграмму прошу простить - рисовал просто для наглядности процесса. В IBingoGame и в BingoGame функция activate(value:Boolean):void присутствует, забыл указать ее на диаграмме.
BlooDHounD - спасибо за помощь, у меня это описано так:
Код AS3:

class BingoGame extends MovieClip implements IBingoGame

Anry_coolboy - изложил проблему намного проще
Попытаюсь еще раз чуть проще: в shell.swf загружается tab_manager.swf (класс TabManager и TabContent), а tab_manager.swf загружает в себя game.swf и привод ее к интерфейсу возвращает null. А если загрузить game.swf в shell.swf - то игра приводится к интерфейсу замечательно.

wvxvw 04.03.2009 11:53

Попробуйте все грузить в CurrentDomain - возможно создаются 2 разных интерфейса (один в загружающей флешке, другой - в загруженой), и соответственно, получается 2 разных интерфейса.

litebox 04.03.2009 12:18

на данном этапе решил проблему так:
Код AS3:

private function getGameInterface(content:DisplayObject):IBingoGame
{
  return (content as IBingoGame);
}
 
private function getChatInterface(content:DisplayObject):IChatRoom
{
  return (content as IChatRoom);
}

т.е. в класс Shell прописал две функции, которые НИГДЕ не вызываются, и теперь в классе TabContent все приводится как надо - т.е. таким образом, видимо, добавил в главную флэшку данные о том, что такие интерфейсы существуют.
wvxvw - а что вы имеете ввиду под CurrentDomain, объясните пожалуйтса

Волгоградец 04.03.2009 12:50

http://www.flasher.ru/forum/showthread.php?t=121010

MerlinTwi 04.03.2009 18:17

Сталкивался с такой проблемой. В данной ситуации флеш действительно создает два разных интерфейса с одинаковым именем. Как вариант решения: введи интерфейс в главную флэшку.
Код:

var tmp:IBingoGame;

litebox 04.03.2009 19:02

Да, два указателя на интерфейсы действительно красивее, чем две функции, которые я нигде не вызываю; ограничился локальными переменными в конструкторе:
Код AS3:

public function Shell()
{
  var tmpBingoGame:IBingoGame;
  var tmpChatRoom:IChatRoom;
}

и все работает :)


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

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