我在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)任何想法为什么?
你想让我创建一个新帖子吗?
谢谢
答案 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.
}
如果任何一项没有意义,请告诉我。 }