克隆对象(拖放)Flash As3

Cloning object (Drag and drop) Flash As3

如何在拖动动画片段后克隆它,并使克隆出现在被拖动的动画片段之前被拖动的位置?

这是我目前拥有的:

movieClip_1.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag_2);

function fl_ClickToDrag_2(event:MouseEvent):void
{
movieClip_1.startDrag();
}

stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_2);

function fl_ReleaseToDrop_2(event:MouseEvent):void
{
movieClip_1.stopDrag();
}

另外我也想知道如何制作一个重置按钮,重置舞台上拖放的对象

您可以 select 在 库面板 中要复制的符号,转到 符号属性 (通过右键单击该符号并 selecting Properties)并启用 Export for ActionScript

作为符号示例,我创建了一个加号并将该符号命名为 Plus。

完成后,您可以轻松创建此符号的新实例:

addChild(new Plus());

请注意 Plus 与您在符号属性中指定的符号相同, 因此,如果您在库中将符号命名为 MovieClip_1 并将其导出为 actionscript,则代码将如下所示:

addChild(new MovieClip_1());

如果这样做,您会注意到符号将放置在 0,0 处,因此接下来要做的是设置新实例的 x,y 位置。首先,您需要创建一个变量,您可以为此实例重复使用:

var newPlus:MovieClip = new Plus();

然后您可以访问它的 xy 属性,就像任何其他 MovieClip 一样。

由于您正在使用 MOUSE_DOWN 事件创建副本,因此您可以使用 MouseEvent's stageX and stageY 属性:

function fl_ClickToDrag_2(event:MouseEvent):void
{
   var newPlus:MovieClip = new Plus();
   newPlus.x = event.stageX;
   newPlus.y = event.stageY;
   addChild(newPlus);
}

只需要开始拖动:

function fl_ClickToDrag_2(event:MouseEvent):void
{
   var newPlus:MovieClip = new Plus();
   newPlus.x = event.stageX;
   newPlus.y = event.stageY;
   addChild(newPlus);
   newPlus.startDrag();
}

当然需要监听阶段MOUSE_UP事件停止拖动。 为此,我们可以让变量存储对 MOUSE_DOWN 处理程序之外的最新复制剪辑的引用。这样,无论何时添加新剪辑,它也将是 MOUSE_UP 处理程序中的 accessible/visible,因此可以停止拖动。要注意的是先检查是否已添加新剪辑,因为用户可能会在不创建副本的情况下单击舞台。

这是评论片段:

import flash.display.MovieClip;

//a reference to the latest/most recently cloned movie clip
var latestClone:MovieClip;

plus.addEventListener(MouseEvent.MOUSE_DOWN, onPlusPressed);

function onPlusPressed(event:MouseEvent):void
{
    //make a new instance using the linkage/Export for ActionScript name
    latestClone = new Plus();
    //copy mouse position to movie clip position
    latestClone.x = event.stageX;
    latestClone.y = event.stageY;
    //add it to the stage
    addChild(latestClone);
    //start dragging it, instead of the symbol manually placed on stage
    latestClone.startDrag();
}

stage.addEventListener(MouseEvent.MOUSE_UP, onStageReleased);

function onStageReleased(event:MouseEvent):void
{
    //if there was a clone already made/dragged
    if(latestClone != null){
        //then release it
        latestClone.stopDrag();
    }
}

请注意,我在舞台上手动放置了一个加号 plus。 所以舞台上的实例是plus,symbol/class名字是Plus:

你可以运行这个here and download the zipped xfl Flash source here

Update 根据您在下面的评论,事实证明使复制的实例可拖动并不那么复杂。这可以通过 3 个步骤进行设置:

  1. 为克隆的实例添加一个 MOUSE_DOWN 事件处理程序。理论上您可以重新使用现有的处理程序,但您需要有一种方法来区分影片剪辑克隆源和克隆实例。有一个单独的处理程序会更干净,仅供克隆实例使用
  2. latestClone 引用设置为当前单击的克隆实例:这样可以重新使用 onStageReleased 处理程序来停止拖动克隆实例
  3. 开始拖动

基于之前使用加号的示例代码,更新后的代码段如下所示:

import flash.display.MovieClip;
import flash.events.MouseEvent;

//a reference to the latest/most recently cloned movie clip
var latestClone:MovieClip;

plus.addEventListener(MouseEvent.MOUSE_DOWN, onPlusPressed);

function onPlusPressed(event:MouseEvent):void
{
    //make a new instance using the linkage/Export for ActionScript name
    latestClone = new Plus();
    //copy mouse position to movie clip position
    latestClone.x = event.stageX;
    latestClone.y = event.stageY;
    //add it to the stage
    addChild(latestClone);
    //start dragging it, instead of the symbol manually placed on stage
    latestClone.startDrag();
    //add a separate MOUSE_DOWN event handler for the cloned instance
    latestClone.addEventListener(MouseEvent.MOUSE_DOWN,onClonedPlusPressed);
}
//event handler for a cloned instance
function onClonedPlusPressed(event:MouseEvent):void{
    //set the latest clone to be what's currently clicked (MouseEvent's current target)
    //for more details on target/currentTarget and event bubbling see http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html
    latestClone = MovieClip(event.currentTarget);//event.currentTarget return an Object and latestClone is a MovieClip, therefore we cast the currentTarget Object to a MovieClip type

    //start dragging
    latestClone.startDrag();
}

stage.addEventListener(MouseEvent.MOUSE_UP, onStageReleased);

function onStageReleased(event:MouseEvent):void
{
    //if there was a clone already made/dragged
    if(latestClone != null){
        //then release it
        latestClone.stopDrag();
    }
}