2012-04-16 2 views
0

У меня есть тестовый пример, демонстрирующий мою проблему.Выберите файл FXG во время выполнения - по его имени

Он работает мгновенно, когда вы добавляете следующие 4 коротких файлов в новый проект Flex Mobile в Flash Builder 4.6:

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/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/активы/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

Удивительный, спасибо –

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 *. –

+1

Вы можете просто передать строку и использовать ее в инструкции switch. switch (item) {case "star": return new Star(); ломать; случай «король» возвращает нового короля(); break} – francis

+0

У меня есть файлы FXG для 52 игральных карт и надеюсь, что есть более приятное решение ... –

 Смежные вопросы

  • Нет связанных вопросов^_^