随机MovieClip的addEventListener

时间:2014-02-07 16:58:39

标签: actionscript-3

我在AS3制作游戏。

我已经输入了我的代码:

public var _classes:Array = new Array(poubelle1, poubelle2, poubelle3);
public var _movieClips:Array = new Array(); 

public function apparitionDechet(event:TimerEvent):void {

    _movieClips.push(new _classes[Math.floor(Math.random() * _classes.length)]());
    stageRef.addChild(_movieClips[_movieClips.length-1]);

我正在尝试在MovieClip上放置一个addEventListener。 播放器应该能够在出现时单击MovieClip,或者他可以等待。很少会出现,他可以随时点击它们。 每次点击都会使MoviClip消失..

所以我说:

_movieClips[1].addEventListener(MouseEvent.CLICK, removePoubelle, false, 0, true); 

}
        public function removePoubelle(e:MouseEvent):void{
            if(e.target=="_movieClips[0]"){
            trace("ok1");   
            }
            if(e.target=="_movieClips[1]"){
            trace("ok2");   
            }
             if(e.target=="_movieClips[2]"){
            trace("ok3");   
            }

但不是那个......

你知道我怎么做吗? 这是我第一次使用MovieClips的随机幻象......

非常感谢,


修改

所以我按照你的提示做了这个:

        public function apparitionDechet(event : TimerEvent):void{


var mc:DisplayObject = new _classes[Math.floor(Math.random() * _classes.length)]();
    _movieClips.push(mc);
    stageRef.addChild(mc);
    mc.addEventListener(MouseEvent.CLICK, removePoubelle, false, 0, true);

}
        public function removePoubelle(e:MouseEvent):void{
var mc:DisplayObject = e.target;
            var i:int=_movieClips.indexOf(mc);
if (i>=0){ 
    _movieClips.splice(i,1);
    mc.parent.removeChild(mc);
}

}

但是我得到了错误1118将静态类型Object的值隐式强制转换为可能不相关的类型flash.display:DisplayObject


编辑2

快速提问,是否可以这样做:

if(stageRef.contains(poubelle1)) { 
trace("poubelle1détécté"); 
} 
if(stageRef.contains(poubelle2)) { 
trace("poubelle2 détécté"); 
} 
? 

movieClips poubelle1和poubelle 2定义如下

public var _classes:Array = new Array(poubelle1, poubelle2, poubelle3);
public var _movieClips:Array = new Array();
如果我这样做,它似乎不起作用。(错误1027 Contrainte implicite d'une valeur du type Class vers un type sans rapport flash.display:DisplayObject)任何想法为什么? 你想让我创建一个新帖子吗?

谢谢

2 个答案:

答案 0 :(得分:1)

如果要删除单击的动画片段,则已将其作为事件的目标。所以你得到它的父母并致电removeChild()。不要忘记从目标中删除事件监听器。

public function removePoubelle(e:MouseEvent):void {
    var mc:DisplayObject = e.target as DisplayObject;
    if (!mc) return; // typecast failed
    mc.parent.removeChild(mc);
    // mc.removeEventListener(MouseEvent.CLICK, removePoubelle, false, 0, true); 
    // the line above might not be needed as the listener weakly references the mc
}

您在创建新影片剪辑后立即放置了侦听器。

public function apparitionDechet(event : TimerEvent):void {
    var mc:DisplayObject = new _classes[Math.floor(Math.random() * _classes.length)]();
    _movieClips.push(mc);
    stageRef.addChild(mc);
    mc.addEventListener(MouseEvent.CLICK, removePoubelle, false, 0, true); 
}

请参阅,如何避免引用新创建的影片剪辑而不使用丑陋的_movieClips[_movieClips.length-1]构造?您只需创建一个局部变量,然后为_classes中的随机MC实例化,然后使用该变量执行创建时所需的所有其他操作。

但是,这仍然不够 - 你的“poubelle”仍在你的_movieClips数组中,所以它会增长。你也需要清理阵列。因此,请将此代码添加到removePoubelle

var i:int=_movieClips.indexOf(mc);
if (i>=0) _movieClips.splice(i,1);

这将获取所单击的影片剪辑在数组中的位置,如果它是有效的(零或更多),则会告诉该数组删除该元素。

答案 1 :(得分:1)

你不应该只使用_movieClips [1]。这特指在_movieClips数组中的SECOND对象。 将MovieClip添加到_movieClips数组后,应立即添加eventListener。您可以将它添加到最近的'.push'ed MovieClip中,如下所示:

_movieClips[_movieClips.length-1].addEventListener(MouseEvent.CLICK, removePoubelle);

在将MovieClip推入_movieClips数组的行之后的下一行上执行此操作。

您的事件处理程序(removePoubelle函数)将传递一个MouseEvent,您可以引用此事件的.target来隔离单击了WHICH MovieClip:

private function removePoubelle(e:MouseEvent):void {
    var mcToRemove:DisplayObject = e.target;
    removeChild(mcToRemove); // note there is no need to refer to .parent as the MovieClip was added in this Class
    // more code to come - see below
}

另请注意:由于每个MovieClip都会在创建时添加eventListener,因此e.target将始终引用单击的MovieClip。

您可能想要实现的唯一另一件事是从_movieClips数组中删除MovieClip。这也可以在removePoubelle函数中完成:

var removalIndex:int = _movieClips.indexOf(MovieClip(e.target)); // here I am 'casting' the e.target to the type MovieClip. That basically just means I'm changing it's type from DisplayObject to MovieClip (which is a subclass of DisplayObject)
if (removalIndex>-1) {
    _movieClips.splice(removalIndex, 1); // this line removes one item at the index returned from the _movieClips.indexOf... line above.
}

如果任何一项没有意义,请告诉我。 }