影片剪辑示例:RuntimeAssetsExplorer

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

“为 ActionScript 导出”功能非常适合用于在多个项目间使用库的情况。如果 Flash Player 或 AIR 执行 SWF 文件,则任何 SWF 文件只要与加载它的 SWF 处于同一安全沙箱中就可以使用已导出到 ActionScript 的元件。这样,单个 Flash 文档可生成仅用于保存图形资源的 SWF 文件。此技术对大型项目特别有用,在这样的项目中,处理可视资源的设计人员可与创建“包装”SWF 文件的开发人员同时工作,然后在运行时加载图形资源 SWF 文件。您可以使用此方法维护一系列图形资源与编程开发进度无关的版本文件。

RuntimeAssetsExplorer 应用程序加载属于 RuntimeAsset 子类的任何 SWF 文件,并允许您浏览该 SWF 文件的可用资源。示例说明了以下过程:

  • 使用 Loader.load() 加载外部 SWF 文件

  • 动态创建为 ActionScript 导出的库元件

  • 使用 ActionScript 控制 MovieClip 播放

开始之前,注意每个要在 Flash Player 中运行的 SWF 文件必须位于同一个安全沙箱中。有关详细信息,请参阅安全沙箱

若要获取此范例的应用程序文件,请下载 Flash Professional 范例。RuntimeAssetsExplorer 应用程序文件位于文件夹 Samples/RuntimeAssetsExplorer 中。该应用程序包含以下文件:

文件

说明

RuntimeAssetsExample.mxml

RuntimeAssetsExample.fla

适用于 Flex (MXML) 或 Flash (FLA) 的应用程序的用户界面。

RuntimeAssetsExample.as

Flash (FLA) 应用程序的文档类。

GeometricAssets.as

用于实现 RuntimeAsset 接口的示例类。

GeometricAssets.fla

链接到 GeometricAssets 类的 FLA 文件(该类是 FLA 的文档类)包含为 ActionScript 导出的元件。

com/example/programmingas3/runtimeassetexplorer/RuntimeLibrary.as

用于定义将加载到浏览器容器中的所有运行时资源 SWF 文件所需方法的接口。

com/example/programmingas3/runtimeassetexplorer/AnimatingBox.as

形状为旋转方框的库元件的类。

com/example/programmingas3/runtimeassetexplorer/AnimatingStar.as

形状为旋转星形的库元件的类。

建立运行时库界面

若要使浏览器与 SWF 库正确交互,运行时资源库的结构就必须具有一定程式。我们将通过创建一个接口来完成此过程(接口类似于类,因为接口也是用于区分预期结构的方法的蓝图;同时接口又与类不同,因为接口不包含方法体)。接口提供了在运行时库和浏览器之间相互通信的方法。加载到浏览器中的运行时资源的每个 SWF 都将实现此接口。有关接口及其使用方法的更多信息,请参阅《学习 ActionScript 3.0》中的“接口”。

RuntimeLibrary 接口非常简单 — 我们只需要一个函数,这个函数能够为浏览器提供类路径的数组以导出元件并使元件在运行时库中可用。为此,该接口具有单个方法:getAssets()

package com.example.programmingas3.runtimeassetexplorer 
{ 
    public interface RuntimeLibrary 
    { 
        function getAssets():Array; 
    } 
}

创建资源库 SWF 文件

通过定义 RuntimeLibrary 接口,可以创建能够加载到另一个 SWF 文件中的多个资源库 SWF 文件。制作资源的单个 SWF 库包括四个任务:

  • 为资源库 SWF 文件创建一个类

  • 为库中包含的单个资源创建类

  • 创建实际图形资源

  • 将图形元素与类关联并发布库 SWF

创建一个类以实现 RuntimeLibrary 接口

下一步,我们将创建要实现 RuntimeLibrary 接口的 GeometricAssets 类。这个类将成为 FLA 的文档类。此类的代码与 RuntimeLibrary 接口非常相似,不同之处在于,在类定义中,getAssets() 方法有方法体。

package 
{ 
    import flash.display.Sprite; 
    import com.example.programmingas3.runtimeassetexplorer.RuntimeLibrary; 
     
    public class GeometricAssets extends Sprite implements RuntimeLibrary  
    { 
        public function GeometricAssets() { 
             
        } 
        public function getAssets():Array { 
            return [ "com.example.programmingas3.runtimeassetexplorer.AnimatingBox", 
                     "com.example.programmingas3.runtimeassetexplorer.AnimatingStar" ];     
        } 
    } 
}

如果要创建第二个运行时库,可以另外创建一个基于另一个类(例如 AnimationAssets)的 FLA,该类可提供自带的 getAssets() 实现。

为每个 MovieClip 资源创建类

对于本示例,我们只扩展 MovieClip 类而不为自定义资源添加任何功能。以下 AnimatingStar 的代码类似于 AnimatingBox 的代码:

package com.example.programmingas3.runtimeassetexplorer 
{ 
    import flash.display.MovieClip; 
     
    public class AnimatingStar extends MovieClip 
    { 
        public function AnimatingStar() { 
        } 
    } 
}

发布库

现在将基于 MovieClip 的资源连接到新类,方法是创建一个新的 FLA 并在“属性”检查器的“文档类”字段中输入 GeometricAssets。为实现本示例的目的,我们将创建两个使用时间轴补间的非常简单的形状,其中一个形状顺时针旋转超过 360 帧。animatingBoxanimatingStar 元件都设为“为 ActionScript 导出”,并将“类”字段设置为 getAssets() 实现中指定的对应类路径。保留 flash.display.MovieClip 的默认基类,因为我们希望对标准 MovieClip 方法进行子分类。

在设置了元件的导出设置后,可发布 FLA。您现在便拥有了第一个运行时库。该 SWF 文件可以加载到另一个 AVM2 SWF 文件中,且 AnimatingBox 和 AnimatingStar 元件可用于新的 SWF 文件。

将库加载到另一个 SWF 文件中

要处理的最后一个功能性部分是资源浏览器的用户界面。在本示例中,运行时库的路径硬编码为一个名为 ASSETS_PATH 的变量。或者,您也可以使用 FileReference 类,例如,用来创建在硬盘驱动器上浏览特定 SWF 文件的接口。

成功加载运行时库后,Flash Player 会调用 runtimeAssetsLoadComplete() 方法:

private function runtimeAssetsLoadComplete(event:Event):void 
{ 
    var rl:* = event.target.content; 
    var assetList:Array = rl.getAssets(); 
    populateDropdown(assetList); 
    stage.frameRate = 60; 
}

在此方法中,变量 rl 表示已加载的 SWF 文件。代码将调用已加载的 SWF 文件的 getAssets() 方法,获取可用资源的列表,并通过调用 populateDropDown() 方法用这些资源填充具有可用资源列表的 ComboBox 组件。该方法会依次存储每个资源的完整类路径。单击用户界面上的“添加”按扭即会触发 addAsset() 方法:

private function addAsset():void 
{ 
    var className:String = assetNameCbo.selectedItem.data; 
    var AssetClass:Class = getDefinitionByName(className) as Class; 
    var mc:MovieClip = new AssetClass(); 
    ... 
}

此方法获取 ComboBox 中当前所选资源的类路径 (assetNameCbo.selectedItem.data),并使用 getDefinitionByName() 函数(来自 flash.utils 包)获取对该资源的类的实际引用,以创建该资源的新实例。