2012-04-16 3 views
0

문제점을 증명하는 테스트 사례가 있습니다.런타임에 FXG 파일을 선택하십시오 - 이름으로

는 Flash Builder에서 새로운 플렉스 모바일 프로젝트 4.6에 다음 4 개 짧은 파일을 추가 할 때, 즉시 실행 :

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/ko/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); 
      } 
     } 
    } 
} 

입니다 다음에 제공 I이 많은 적절하게 이름을 FXG 파일 assets 서브 디렉토리 (실제 응용 프로그램에서는 spades_queen.fxg, spades_king.fxg, spades_ace.fxg 등) - 런타임에 FXG 파일을 어떻게 선택합니까?

주석으로 라인 위에 나에게 런타임 오류 제공 : 나는 SRC에/Star.fxg을 SRC/자산/EN/Star.fxg를 이동하면

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

모든 ...

작동을

답변

1

자산에 Star.fxg 및 King.fxg을 말해봐 이름으로 사용. 파일 위치를 옮기는 것이 왜 오류를 우회하는지 혼란 스럽습니다.

그러나 해당 파일 참조를 파일에 추가하십시오.

import assets.en.Star 

을 그리고 파일이 응용 프로그램으로 컴파일해야합니다, 그래서 당신은 그냥 사용 결코 둠의 인스턴스를 만들 : 그것을 가져 오기 다음이 줄

private var myStart :Star; 

를 작동합니다 :

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

컴파일러 인수를 사용하여 FXG 클래스를 완성 된 응용 프로그램으로 강제 컴파일 할 수도 있습니다.

Flex로 제작 한 Casual Game에서 이와 똑같은 방식을 사용합니다.

그러나 이상한 점은 파일을 다른 디렉토리로 이동하면 모든 것이 문제없이 작동한다는 것입니다. 잘못된 패키지를 참조하지 않는 한 그것은 수수께끼입니다. (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가 완성 된 응용 프로그램에 컴파일되지 않기 때문에이 없기 때문에이 런타임 오류가있는 것 같은데요

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": 새 Star()를 반환합니다. 단절; 사건 "왕"이 새로운 왕을 되 찾는다. break} – francis

+0

나는 52 개의 카드를위한 FXG 파일을 가지고 있으며 더 좋은 해결책이 있기를 바랍니다. –