2011-01-21 17 views
0

私はSpriteを拡張するBuildingSpriteを持っています。私は主なアプリケーションに外部swfライブラリを読み込もうとします。外部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スプライトを拡張します。

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(); 

私はデバッグし、このエラーを取得: メインスレッド(:TypeError例外:エラー#1034:型変換に失敗しました:一時停止をすることはできません 変換BuildingSpriteにツリーの@ c8f0301。)私が思う

型キャストエラーがあります。 外部swfライブラリを読み込んでカスタムクラスに割り当てる方法はありますか?ここ

答えて

1

問題はTreeが既に

BuildingSpriteはc8f0301 @ツリーを変換することはできません」Spriteクラスを拡張するクラスが別のクラス拡張スプライトされていることです。スプライトがトランクであり、クラスがブランチであるツリーと考えることができますが、どちらも元のスプライトクラスに関係していて、互いに認識できません。

あなたがする必要があることは、それらがどのように関連しているかを示すことです。ツリーをスプライトに、スプライトをBuildingSpriteに2段階で変換します。

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

あなたのツリークラスの追加機能でSpriteクラスを拡張した場合、あなたはこれらの機能を失うか、いくつかの問題に入るが、それはあなたが使用したいだけのグラフィックである場合だろうが、これはすべきそれをやる。


サイドノートでは、利用可能なライブラリを使用すると処理が高速化されます。あなたがチャンスを得るのであれば、私が持っている必要がありますように

が見える


swfLoad

下casalib、特に(トピックに関連する)contentAsMovieClipcreateClassByName機能を調べ、編集を持っていますそれをもっとテストしました。それはあなたがこの var s:Sprite = (new assetClass() as Sprite)を行う場合には、それが他の方法で回避するのではなく)でどんなクラスassetClass(へsを変換していることが判明したので、あなたはsのトレースを行う場合には、スプライトではありません、それ以上

私がこれを処理する方法は、一般的なスプライト(実際にはCasaSprite)を作成し、var view:Sprite(またはdisplayObjectまたはMovieClip)を子として追加することです。これはおそらくあなたが探していた答えではありませんが、うまくいきます。

0

私は、コードをトレースしてみました:

trace(new assetClass() as Sprite) 

そして、それは返さ:

[object Tree] 

そして

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

をしかし、それは返さ:

null 

私は

  • は、 "ActionScriptに書き出し"

  • と "基本クラス:flash.display.MovieClipと" 有効にすることを図書館のツリー記号でTree.swfを作成し

ここにエラーがありますか?

ありがとうございました。アイソメトリックライブラリを使用してゲームを作成しています。 BitmapDataを使用して各建物にpngを読み込む代わりに、ライブラリ内のすべての建物を含む外部ライブラリswfをロードしようとしています。

swfのファイルサイズは、すべてのpngファイルよりも小さいと思います。私は、Sprite/MovieClipを拡張してDirectionやCostなどのカスタムプロパティを持つことができるBuildingクラスのカスタムクラスが必要です。参照用にダウンロードできるリソースサンプルコードはありますか?ありがとう。

関連する問題