克隆对象(拖放)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();
然后您可以访问它的 x
和 y
属性,就像任何其他 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 个步骤进行设置:
- 为克隆的实例添加一个
MOUSE_DOWN
事件处理程序。理论上您可以重新使用现有的处理程序,但您需要有一种方法来区分影片剪辑克隆源和克隆实例。有一个单独的处理程序会更干净,仅供克隆实例使用
- 将
latestClone
引用设置为当前单击的克隆实例:这样可以重新使用 onStageReleased
处理程序来停止拖动克隆实例
- 开始拖动
基于之前使用加号的示例代码,更新后的代码段如下所示:
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();
}
}
如何在拖动动画片段后克隆它,并使克隆出现在被拖动的动画片段之前被拖动的位置?
这是我目前拥有的:
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();
然后您可以访问它的 x
和 y
属性,就像任何其他 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 个步骤进行设置:
- 为克隆的实例添加一个
MOUSE_DOWN
事件处理程序。理论上您可以重新使用现有的处理程序,但您需要有一种方法来区分影片剪辑克隆源和克隆实例。有一个单独的处理程序会更干净,仅供克隆实例使用 - 将
latestClone
引用设置为当前单击的克隆实例:这样可以重新使用onStageReleased
处理程序来停止拖动克隆实例 - 开始拖动
基于之前使用加号的示例代码,更新后的代码段如下所示:
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();
}
}