@Neal Davis 关于导致问题的原因是正确的,但是我建议在动物到达目的地位置后删除事件侦听器而不是侦听MOUSE_UP
释放函数中动物本身的事件:
function fl_ReleaseToDrop_3(event:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_3);
Pig.stopDrag();
//...
}
附加建议。
也正如@Organis 指出的那样。拥有更通用的代码要简单得多。
考虑有这样的事情:
文档类:
package
{
import flash.display.Sprite;
import flash.geom.Point;
public class Main extends Sprite
{
private var animals:Vector.<Animal> = Vector.<Animal>([]);
public function Main() {
animals.push(new Animal("pig", pigMc, 578, 208, "oink.mp3"));
animals.push(new Animal("cow", cowMc, 411, 140, "moo.mp3"));
animals.push(new Animal("duck", duckMc, 56, 225, "quack.mp3"));
}
}
}
和简单的动物类:
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.media.Sound;
import flash.net.URLRequest;
public class Animal
{
private var _name:String;
private var _dropMargin:Number = 10;
private var _startPos:Point = new Point();
private var _endPos:Point = new Point();
private var _sound:Sound;
private var _view:Sprite;
public function Animal(name:String, view:Sprite, endX:Number = 0, endY:Number = 0, sound:String = null) {
_name = name;
_view = view;
_startPos.x = _view.x; _startPos.y = _view.y;
_endPos.x = endX; _endPos.y = endY;
_sound = new Sound(new URLRequest(sound));
view.addEventListener(MouseEvent.MOUSE_DOWN, onMDown);
}
private function onMDown(e:MouseEvent):void{
_view.stage.addEventListener(MouseEvent.MOUSE_UP, onMUp);
_view.startDrag();
}
private function onMUp(e:MouseEvent):void {
_view.stage.removeEventListener(MouseEvent.MOUSE_UP, onMUp);
_view.stopDrag();
//Distance to destination point
var dd:Number = Point.distance(pos, _endPos);
if (dd > dropMargin) pos = _startPos;
else {
pos = _endPos;
_sound.play();
}
}
public function get view():Sprite{return _view;}
public function get dropMargin():Number{return _dropMargin;}
public function set dropMargin(value:Number):void{_dropMargin = value;}
public function get pos():Point{return new Point(_view.x, _view.y);}
public function set pos(value:Point):void{
_view.x = value.x;
_view.y = value.y;
}
}
}