Загрузка внешнего SWF и назначить его на пользовательский класс - PullRequest
0 голосов
/ 21 января 2011

У меня есть BuildingSprite, расширяющий Sprite.Я пытаюсь загрузить внешнюю библиотеку SWF в мое основное приложение.

У меня есть этот код, и он отлично работает:

private function loadBuilding():void{
// this context is necessary to find the shared assets
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);

// load in the asset swf
var loader:Loader = new Loader();
var req:URLRequest = new URLRequest("assets/Tree.swf");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onAssetsLoaded);  
    loader.load(req, context);
 }


private function onAssetsLoaded(_event:Event):void{
// get a reference to the loaded library
var loader:Loader = LoaderInfo(_event.target).loader;
var library:* = loader.content;
var assetClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("Tree") as Class;
// create an instance of the shared asset
var mySprite:Sprite = new assetClass();       
.....
 }

Я создал новый класс - BuildingSprite, который расширяет Sprite:

    package
{   
import flash.display.Sprite;

public class BuildingSprite extends Sprite
{
    public function BuildingSprite()
    {
        super();
    }
}
}

И из onAssetsLoaded выше, я меняю код:

var mySprite:Sprite = new assetClass();

на

var mySprite:BuildingSprite = new assetClass();

Я отлаживаю и получаю эту ошибку: Main Thread (Suspended: TypeError:Ошибка № 1034: сбой приведения типа: невозможно преобразовать Tree @ c8f0301 в BuildingSprite.)

Я думаю, что произошла ошибка приведения типа.Есть ли способ загрузить внешнюю библиотеку SWF и присвоить ее пользовательскому классу?

Ответы [ 2 ]

1 голос
/ 21 января 2011

проблема здесь в том, что Tree - это класс, расширяющий класс Sprite, уже " не может преобразовать Tree @ c8f0301 "

BuildingSprite - другой классрасширяющий спрайт.Думайте об этом как о дереве, где Sprite является стволом, а классы являются ветвями, в то время как оба относятся к своему первоначальному классу Sprite, они не узнают друг друга.

что вам нужно сделать, этопоказать, как они связаны.путем преобразования дерева в спрайт и спрайта в BuildingSprite в два этапа.

var mySprite:BuildingSprite = (new assetClass() as Sprite) as BuildingSprite ;

Если вы расширили класс Sprite дополнительными функциями в своем классе дерева, вы потеряете эти функции.или столкнуться с некоторыми проблемами, но если вы хотите использовать только графику, это следует сделать.


в примечании, использование доступных библиотек может ускорить процесс.Так что, если у вас есть шанс, посмотрите на casalib, в частности (относящиеся к теме) функции contentAsMovieClip и createClassByName в swfLoad


edit

Похоже, я должен был проверить это больше.Оказывается, что если вы сделаете это var s:Sprite = (new assetClass() as Sprite), он преобразует s в любой класс assetClass (), а не наоборот, поэтому, если вы сделаете трассировку s, это не будет Sprite.подробнее

способ, которым я имею дело с этим, - это создать общий спрайт (на самом деле CasaSprite) и добавить var view:Sprite (или displayObject или MovieClip) в качестве дочернего элемента.Вероятно, это не тот ответ, который вы искали, но он работает.

0 голосов
/ 21 января 2011

Я попытался отследить код:

trace(new assetClass() as Sprite)

И он вернул:

[object Tree]

И

trace( (new assetClass() as Sprite) as BuildingSprite )

Но он вернул:

null

Я создал Tree.swf с символом дерева в библиотеке, который

  • включает «Экспорт для ActionScript»

  • и «Базовый класс: flash.display.MovieClip»

Любая ошибка здесь?

Спасибо за руководство.Я создаю игру, используя изометрическую библиотеку.Вместо того, чтобы загружать каждое здание с помощью png с помощью BitmapData, я пытаюсь загрузить внешнюю библиотеку SWF, которая содержит все здания в библиотеке.

Я считаю, что размер файла для SWF будет меньше, чем все файлы PNG.Мне нужен специальный класс для Building, который расширяет Sprite / MovieClip, чтобы у меня были такие свойства, как Direction, Cost и т. Д. У вас есть пример кода ресурса, который я могу загрузить для справки?Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...