2011-12-17 78 views
0

下面是我的AS3代码:AS3 - 如何在事件处理函数中获取对象的名称?

public function load_swfs(event:Event) 
    { 
     var loader:Loader = event.target.getChildAt(0) as Loader; 
     var mc:MovieClip = loader.content as MovieClip; 
     var mc_name = 'somethingGeneratedElsewhere'; 
     this.animations[mc_name] = mc; 
    } 

    // -------------------------------------------------------------------- 
    public function add(mc_name) 
    { 
     //this.animations is a object that holds a bunch of dynamically loaded SWF files. 
     addChild(this.animations[mc_name]); 
     this.animations[mc_name].addEventListener(Event.ENTER_FRAME, enter_frame_handler); 
    } 

    // -------------------------------------------------------------------- 
    public function enter_frame_handler(e:Event) 
    { 
     //how do I get mc_name in this function 
     // Example, if I run add('movie123'). How do I get 'movie123' in this function? 
    } 

如果我运行添加( 'movie123')。如何在enter_frame_handler函数中获取字符串'movie123'?

UPDATE

这个论坛后(Click Here)介绍我遇到的问题,但不提供我正在寻找解决方案。幸运的是@kapep提供了一个简单的解决方案来解决这个问题。

回答

3

其他的解决方案通常是更好的选择。如果无法动态添加属性,则仍然可以使用Dictionary将对象映射到名称。

private var animationNames:Dictionary = new Dictionary(); 

public function add(mc_name) 
{ 
    // store animation object and the name 
    animationNames[this.animations[mc_name]] = mc_name; 

    addChild(this.animations[mc_name]); 
    this.animations[mc_name].addEventListener(Event.ENTER_FRAME, enter_frame_handler); 
} 

// -------------------------------------------------------------------- 
public function enter_frame_handler(e:Event) 
{ 
    var name:String = animationNames[e.currentTarget]; 
    // ... 
} 

无论如何,请记住,this.animations[mc_name]没有使用真正的影片剪辑名称,这是不可能得到的变量名的方式。如果你会这样做this.animations[some_other_name] = this.animations[mc_name];你会有两个变量指向同一个对象。将无法确定哪个变量用于附加侦听器。因此,请确保您了解影片剪辑名称与其变量名称之间的区别。

2
public function eventListener(e:Event) 
{ 
    var target:MovieClip = (e.target as MovieClip); 
    // Target is the object that dispatched the event. 
} 
+0

返回一个动画片段。我需要字符串格式的名称。如果`this.animations ['awesomeMovie']`那么我需要在`enter_frame_handler'中获得'awesomeMovie'。那可能吗?我尝试了`e.target.name`并得到`instance5`或类似的东西。 – zechdc 2011-12-17 04:03:26

+0

你可以将代码添加到`this.animations`集合吗? 'e.target.name`属性与您在代码中使用的名称是分开的。另外,你打算怎么处理字符串?请记住,在这种情况下,this.animations [“awesomeMovie”]指的是与“e.target”相同的对象。 – 2011-12-17 04:25:47

2

首先,您需要命名的影片剪辑,那么你可以使用e.currentTarget.name检索他们的名字:

// -------------------------------------------------------------------- 
public function add(mc_name) 
{ 
    //this.animations is a object that holds a bunch of dynamically loaded SWF files. 
    addChild(this.animations[mc_name]); 
    this.animations[mc_name].name = mc_name; // IMPORTANT - name the MovieClip 
    this.animations[mc_name].addEventListener(Event.ENTER_FRAME, enter_frame_handler); 
} 

// -------------------------------------------------------------------- 
public function enter_frame_handler(e:Event) 
{ 
    trace(e.currentTarget.name); 
} 
+0

我试过了,我得到了`错误#2078:无法修改放置时间轴的对象的名称属性。' – zechdc 2011-12-17 04:20:53

+2

如果它们是直接在时间线上创建的,那么您需要在那里命名它们。只需在“属性”面板中设置“实例名称”属性即可。如果他们已经有了一个名字,你应该可以通过`trace(e.currentTarget.name);` – 2011-12-17 04:24:08

2
public function eventListener(e:Event) 
{ 
    var target:MovieClip = (e.target as MovieClip); 
    trace(target.name); // should return the name 
} 
0

或者你可以使用这条线,如果您寻找它的索引

跟踪(stage.getChildIndex(影片剪辑(event.target)));