【问题标题】:Loading external swf and assign it to custom class加载外部 swf 并将其分配给自定义类
【发布时间】:2011-06-12 22:17:15
【问题描述】:

我有一个扩展 Sprite 的 BuildingSprite。我尝试将外部 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();       
.....
 }

我创建了一个新类 - 扩展 Sprite 的 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:类型强制失败:不能 将 Tree@c8f0301 转换为 BuildingSprite。)

我认为存在类型转换错误。 有没有办法加载外部 swf 库并将其分配给自定义类?

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    这里的问题是Tree是一个扩展Sprite类的类已经“cannot convert Tree@c8f0301

    BuildingSprite 是另一个扩展 sprite 的类。把它想象成一棵树,其中 Sprite 是树干,类是分支,虽然两者都与它们原来的 Sprite 类相关,但它们彼此不认识。

    您需要做的是展示它们之间的关系。通过分两步将 Tree 转换为 sprite 并将 sprite 转换为 BuildingSprite。

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

    如果您在 Tree 类中使用附加功能扩展 Sprite 类,您可能会丢失这些功能或遇到一些问题,但如果它只是您想要使用的图形,则应该这样做。


    附带说明,使用可用的库可以加快速度。因此,如果您有机会,请查看 casalib,特别是(与主题相关的)swfLoad 下的contentAsMovieClipcreateClassByName 函数


    编辑

    看来我应该多测试一下。事实证明,如果你这样做 var s:Sprite = (new assetClass() as Sprite),它将s 转换为assetClass() 的任何类,而不是相反,因此如果您跟踪s,它将不再是Sprite

    我处理这个问题的方法是创建一个通用精灵(实际上是 CasaSprite)并添加一个 var view:Sprite(或 displayObject 或 MovieClip)作为孩子。这可能不是您要寻找的答案,但它确实有效。

    【讨论】:

      【解决方案2】:

      我试图追踪代码:

      trace(new assetClass() as Sprite)
      

      它返回了:

      [object Tree]
      

      还有

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

      但它返回了:

      null
      

      我在库中创建了带有树符号的 Tree.swf

      • 启用“为 ActionScript 导出”

      • 和“基类:flash.display.MovieClip”

      这里有什么错误吗?

      感谢指导。我正在使用等距库创建游戏。我没有使用 BitmapData 使用 png 加载每个建筑物,而是尝试加载一个包含库中所有建筑物的外部库 swf。

      我相信 swf 的文件大小将小于所有 png 文件。我需要一个扩展 Sprite/MovieClip 的 Building 自定义类,以便我可以拥有 Direction、Cost 等自定义属性。您有任何资源示例代码可以下载以供参考吗?谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 2023-03-16
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多