2008-09-17 10 views
5

많은 임베디드 애셋이있는 클래스가 있습니다.Flex/AS3에서 getDefinitionByName을 사용하여 포함 된 에셋의 클래스 정의를 얻는 방법

클래스 내에서 애셋의 클래스 정의를 이름으로 가져오고 싶습니다. getDefinitionByName() 및 ApplicationDomain.currentDomain.getDefinition()을 사용하여 시도했지만 둘 다 작동하지 않습니다.

예 :

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    var ClassDef:Class = getDefinitionByName(name) as Class; //<<-- Fails 
    _image = new ClassDef() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

답변

8

이 귀하의 질문에 대답하지 않지만,이 문제를 해결할 수 있습니다. 나는이 같은 일을해야하고 믿고 :

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    _image = new this[name]() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

내가 힘든 시간 대괄호 표기법이 봉인 된 클래스에 작동하는지 기억하는 데 문제가 있습니다. 그렇지 않은 경우 간단한 해결책은 클래스를 동적으로 표시하는 것입니다.

+0

안녕하세요! 좋은 직장, 그게 효과가! – user8399

2

멋진 getDefinitionByName() 메소드를 사용할 필요없이 동적으로 참조하기 만하면됩니다. 귀하의 경우 '실패'행을 다음으로 대체하십시오 :

var classDef:Class = MyClass[name] as Class; 

그리고 그렇게해야합니다.

+0

이 작동합니다! 덕분에 davr – jedierikb

0

정말 고마워요! 나는 POS getDefinitionByName이 getQualifiedClassName과 함께 작동하도록 거의 5 시간을 보냈다. 나는 물건을 던질 준비가되었다 !! 내 마지막 작업 코드는 이런 식으로 배열에서 문자열 이름을 가져옵니다.

CreatureParam은 문자열의 2 차원 배열입니다.

유형은 PHP를 통해 MYSQL 데이터베이스에서 온 HTML 태그에 의해 플래시로 전송되는 정수입니다.

Mark1_cb는 스테이지에 있으며 인스턴스 이름을 가진 콤보 박스입니다. 출력도 정수입니다.

바로 아래 코드는 외부 swf "ArtLibrary.swf"에서 "BirdBodyColor_mc"클래스를 가져옵니다. BirdBodyColor_mc는 png 이미지에서 생성 된 무비 클립입니다. ArtLibrary.fla에서 동영상 클립을 두 번 클릭하고 두 번째 키 프레임을 삽입해야합니다. 무비 클립은 분명히 두 개의 프레임이 필요하거나 플래시가이를 스프라이트로 가져 오려고 시도하고 유형 불일치가 발생합니다.

[소스 ("ArtLibrary.swf", 심볼 = "BirdBodyColor_mc")] var BirdBodyColor_mc : 클래스;

일반적으로이 코드를 사용하여이 무비 클립 클래스의 인스턴스를 스테이지에 배치합니다.

myMC : MovieClip = new BirdBodyColor_mc(); addChild (myMC);

var 정의 : Class = this [ "BirdBodyColor_mc"]를 클래스로 사용; var Mark1 : MovieClip = 새 정의();

하지만 배열에서 문자열 값을 사용하여이 작업을 수행해야합니다. 그래서 여기에 그 코드가 있습니다.

var 정의 : Class = This [CreatureParam [Type] [Mark1_cb + 2]] as Class; var Mark1 : MovieClip = 새 정의(); "Image1Class"는 변수 이름이 아닌 실제 클래스 이름 때문에

3

당신의 방법이 작동하지 않는 이유입니다.

당신은 당신이 볼 수 있으므로, 클래스 이름 (함수에 전달해야 하나)을 의미이

import flash.utils.getQualifiedClassName; 
trace(getQualifiedClassName(Image1Class)); 

같은 클래스 이름을 얻을 MyClass_Image1Class 같은 것입니다 수 있습니다.

+0

하지만 getDefinitionByName()은 현재 클래스의 해당 이미지에 액세스하는 경우에만 필요하므로 위의 메서드 중 하나를 권장합니다. – IQAndreas