这段AS2代码的问题在于,当你复制一个影片剪辑并拖动它时,如果你单击鼠标右键以删除该复制,那么原始影片剪辑将会被删除而不是复制。
解决方法是:
更改onMouseDown事件处理程序:修改第二个if语句块中的代码,并使用duplicateMovieClip()函数创建新的副本来替换当前已删除的影片剪辑。具体地说,在这个else if块中,应该使用以下代码来创建新的副本:
this.duplicateMovieClip(“tu” + i, this.getNextHighestDepth()); removeMovieClip(this);
将onPress事件处理程序更改为onMouseUp事件处理程序:由于AS2中startDrag()函数会导致该对象成为活动对象(也就是说,在鼠标左键按下后),因此建议将onPress事件处理程序更改为onMouseUp事件处理程序。这样,只有当鼠标左键释放时才会启动复制和拖动过程。
请参考以下修改后的代码:
var copiedClip: MovieClip = null; // 用于存储被复制的影片剪辑
var originalClip: MovieClip = null; // 用于存储原始影片剪辑
// 循环遍历9个影片剪辑
for (var i = 1; i <= 9; i++) {
var clip: MovieClip = this["tu" + i];
// 设置鼠标左键抬起事件处理程序
clip.onMouseUp = function() {
if (copiedClip == null) {
originalClip = this;
copiedClip = this.duplicateMovieClip("copy", this.getNextHighestDepth()); // 复制当前影片剪辑
copiedClip.startDrag(); // 开始拖动
// 设置全局onMouseMove事件处理程序,跟随鼠标移动
_root.onMouseMove = function() {
if (copiedClip != null) {
copiedClip._x = _root._xmouse;
copiedClip._y = _root._ymouse;
}
};
}
};
// 设置鼠标右键按下事件处理程序
clip.onMouseDown = function() {
if (copiedClip != null && this != originalClip) { // 如果当前有已复制的影片剪辑且不是原始影片剪辑
copiedClip.removeMovieClip(); // 删除已复制的影片剪辑
copiedClip = null;
} else if (copiedClip == null && this == originalClip) { // 如果当前没有已复制的影片剪辑且是原始影片剪辑
var i: Number = parseInt(this._name.substr(2)); // 获取该对象在数组中的索引位置
this.duplicateMovieClip("tu" + i, this.getNextHighestDepth()); //创建新的副本替换当前已删除的对象
removeMovieClip(this);
}
};
}
// 设置全局onMouseUp事件处理程序,停止拖动并放置复制后的图片
_global.onMouseUp = function() {
if (copiedClip != null) {
copiedClip.stopDrag(); // 停止拖动
// 恢复全局onMouseMove事件处理程序为null
_root.onMouseMove = null;
// 将复制后的图片放置在当前鼠标位置,并清除对被复制的影片剪辑和原始影片剪辑的引用
copiedClip._x = _root._xmouse;
copiedClip._y = _root._ymouse;
copiedClip.removeMovieClip();
originalClip = null;
}
};