在运行时选择一个FXG文件 - 按名称

时间:2012-04-16 11:07:36

标签: actionscript-3 flex flex4.6 flex-mobile fxg

我有一个测试用例来证明我的问题。

当您将以下4个短文件添加到Flash Builder 4.6中的新Flex Mobile项目时,它会立即运行:

Screenshot

的src / TestFXG.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    firstView="Home">
</s:ViewNavigatorApplication>

的src /资产/ EN / Star.fxg:

<?xml version='1.0' encoding='UTF-8'?>
<fxg:Graphic xmlns:fxg="http://ns.adobe.com/fxg/2008" version="2">    
    <fxg:Path x="9.399" y="10.049" data="M 82.016 78.257 L 51.895 69.533 L 27.617 89.351 L 26.621 58.058 L 0.231 41.132 L 29.749 30.52 L 37.714 0.241 L 56.944 24.978 L 88.261 23.181 L 70.631 49.083 Z">
        <fxg:fill>
            <fxg:SolidColor color="#FFFFFF"/>
        </fxg:fill>
        <fxg:stroke>
            <fxg:SolidColorStroke 
                caps="none" 
                color="#FFFF66" 
                joints="miter" 
                miterLimit="4" 
                weight="10"/>
        </fxg:stroke>
    </fxg:Path>
</fxg:Graphic>

的src / Home.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:my_components="*"
        title="Display random amount of stars">

    <fx:Script>
        <![CDATA[
            import Star;
            import spark.core.SpriteVisualElement;

            private static const STAR:SpriteVisualElement = new Star();
        ]]>
    </fx:Script>    

    <my_components:MyComp />
</s:View>

的src / MyComp.as:

package {
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;
    import mx.core.UIComponent;
    import spark.core.SpriteVisualElement;
    import assets.Star;

    public class MyComp extends UIComponent {
        private static const WHAT:String = "assets.en.Star";

        override protected function createChildren():void {
            super.createChildren();

            for (var i:uint = 0; i < 3; i++) {
                var star:Star = new Star();
                //var star:SpriteVisualElement = new (getDefinitionByName(WHAT) as Class)();
                star.x = Math.random() * 100;
                star.y = Math.random() * 100;
                addChild(star);
            }
        }
    }
}

我的问题是:如果我在资产子目录中有许多适当命名的FXG文件(在我的真实应用程序中,我有spades_queen.fxg,spades_king.fxg,spades_ace.fxg等) - 如何在运行时选择FXG文件?

上面的注释行给出了运行时错误:

ReferenceError: Error #1065: Variable Star is not defined.
    at global/flash.utils::getDefinitionByName()

当我将 src / assets / en / Star.fxg 移至 src / Star.fxg 时,一切正常......

2 个答案:

答案 0 :(得分:1)

我猜你得到了这个运行时错误,因为Star.fxg没有编译成已完成的应用程序,因为它没有被名称使用。令人困惑的是,为什么移动文件的位置会绕过错误。

但是,尝试在其中添加文件引用。导入它:

import assets.en.Star

创建一个你永远不会使用的dum实例,这样文件肯定会编译到应用程序中:

private var myStart :Star;

然后这一行应该有效:

var star:SpriteVisualElement = new (getDefinitionByName(WHAT) as Class)();

您还可以使用编译器参数强制将FXG类编译到已完成的应用程序中。

我在我的Casual Game中使用同样精确的方法,内置于Flex。

然而,奇怪的是,为什么将文件移动到另一个目录会导致事情无问题。这是一个益智游戏,除非你引用错误的包。 (AKA assets.en.Star - 正如您在代码中使用的那样 - 您在问题中引用的src/assets/Star

答案 1 :(得分:0)

您不需要对getDefinitionByName执行任何操作,您只需创建一个Start的新实例并使用addElement将其放置在舞台上。

        for (var i:uint = 0; i < 3; i++) {
            var star:Star = new Star();
            star.x = Math.random() * 100;
            star.y = Math.random() * 100;
            addElement(star);
        }

为了使其正常工作,您必须导入FXP所在的包。可能是assets.Star

您也可以通过创建新实例来切换类型。

假设您在资产中拥有Star.fxg和King.fxg

import assets.Star;
import assets.King;

var star:Star = new Star();
var king:King = new King();