我有一个测试用例来证明我的问题。
当您将以下4个短文件添加到Flash Builder 4.6中的新Flex Mobile项目时,它会立即运行:
的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 时,一切正常......
答案 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();