2012-04-16 44 views
0

我有一個測試用例來演示我的問題。在運行時選擇一個FXG文件 - 名稱爲

它運行瞬間,當您添加下面的4個短文件到在Flash Builder 4.6新的Flex手機項目:

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/assets/zh/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 /資產/ EN/Star.fxg的src/Star.fxg一切正常......

回答

1

我猜是因爲Star.fxg沒有被編譯成成品應用程序,你會得到這個運行時錯誤,因爲它不是名稱使用。混淆爲什麼移動文件的位置會繞過錯誤。

但是,請嘗試在其中添加文件引用。導入:

import assets.en.Star 

,創造這樣的文件肯定會被編譯到應用程序,你永遠只使用一個達姆實例:

private var myStart :Star; 

,這一行,應該工作:

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

您也可以使用編譯器參數來強制將FXG類編譯到您的完成的應用程序中。

我在我的Casual Game中使用了這種完全相同的方法,內置Flex。

但是,奇怪的是爲什麼將文件移動到不同的目錄導致事情工作沒有問題。這是一個困惑,除非你引用了錯誤的軟件包。 (您在代碼中使用的AKA assets.en.Star - 您在問題中引用的src/assets/Star)。

+0

太棒了,謝謝 – 2012-04-17 07:06:26

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

是的,這個工作 - 在編譯時。但我的問題是:如何在運行時選擇,加載和顯示FXG。例如,當你有一個** var WHAT:String ** - 可以存放* Star *或* King *。 – 2012-04-16 13:47:47

+1

你可以傳入一個字符串並在switch語句中使用它。 switch(item){case「star」:return new Star();打破;案例「國王」返回新國王(); break} – francis 2012-04-16 13:50:36

+0

我有52張撲克牌的FXG文件,希望有更好的解決方案... – 2012-04-16 14:01:16