【问题标题】:Mouse_leave cannot make movieclip snap backMouse_leave 不能使影片剪辑回弹
【发布时间】:2014-09-26 03:43:49
【问题描述】:

我正在尝试在 Flash 中制作一个小型拖放应用程序,我已经能够实现以下 -

1)拖动影片剪辑

2)确保两个影片剪辑在相互重叠时不会互换位置

3) 确保被拖动的 MC 停留在其他影片剪辑的顶部 ..

4) 使影片剪辑在其落到指定位置时保持不动

但是,我无法实现一件非常重要的事情,当光标移出舞台时,影片剪辑会卡在光标上,我希望用户离开舞台的那一刻,正在拖动的剪辑回到原来的位置……

我已尝试为此使用 mouse_leave 选项,但它不起作用...

我正在添加拖放代码如下,请在这里指导我 -

拖码-

保存目标实例、放置实例的数组, 以及放置实例的起始位置。

var hitArray:Array = new Array(hitTarget1,hitTarget2,hitTarget3);
var dropArray:Array = new Array(drop1,drop2,drop3);
var positionsArray:Array = new Array();

这会将鼠标向下和向上监听器添加到放置实例 并添加放置实例的起始 x 和 y 位置 进入数组。

 for (var i:int = 0; i < dropArray.length; i++) {
    dropArray[i].buttonMode = true;
    dropArray[i].addEventListener(MouseEvent.MOUSE_DOWN, mdown);
    dropArray[i].addEventListener(MouseEvent.MOUSE_UP, mUp);
    positionsArray.push({xPos:dropArray[i].x, yPos:dropArray[i].y});
    }

这将拖动已选择的对象并移动它 到显示列表的顶部。这意味着你不能拖动 这个对象在任何东西下面。

function mdown(e:MouseEvent):void {
e.currentTarget.startDrag();
setChildIndex(MovieClip(e.currentTarget), numChildren - 1);
}

这是掉落代码

这会在鼠标移动时停止拖动选定的对象 释放。如果对象落在相应的目标上 然后它被设置为目标的 x 和 y 位置。否则 回到原来的位置。

 function mUp(e:MouseEvent):void {
    var dropIndex:int = dropArray.indexOf(e.currentTarget);
    var target:MovieClip = e.currentTarget as MovieClip;
    target.stopDrag();
    if (target.hitTestObject(hitArray[dropIndex])) {
    target.x = hitArray[dropIndex].x;
    target.y = hitArray[dropIndex].y;
    }else{
    target.x = positionsArray[dropIndex].xPos;
    target.y = positionsArray[dropIndex].yPos;
    }
    }

请告诉我如何在此处使用 mouse_leave 并快速返回, 在下面这样的拖放部分中使用它

stage.addEventListener(Event.MOUSE_LEAVE, mouseLeave);

但总是会出现一些错误,例如阶段不支持属性 x 等。我添加了一些代码,例如将 x 和 y 等同,但它不起作用..请指导

【问题讨论】:

  • 改用stage.addEventListener(MouseEvent.MOUSE_OUT)。 Event.MOUSE_LEAVE 不存在。
  • @SlyRaskal -谢谢,我之前尝试过该代码,它确实可以检测到移动何时离开舞台,但由于某种原因它不会将 MC 恢复到原始状态并且还保持连接到鼠标的 MC 我尝试使用原始 x,y 坐标但它不起作用...@DodgerThud 谢谢,我也会尝试使用鼠标,但似乎 mouse_leave 确实存在...

标签: actionscript-3 flash


【解决方案1】:

MOUSE_LEAVE 显示我们是否在舞台上,但不检测鼠标的位置。您必须在 MOUSE_DOWN 上收集鼠标数据,以将实例限制在限制范围内。

const LL:uint = 0;
const LT:uint = 0;
const LR:uint = stage.stageWidth;
const LB:uint = stage.stageHeight;

function EnterFrame(e:Event):void {
    e.target.x = mouseX;
    e.target.y = mouseY;
    if (mouseX < LL) {e.target.x = LL;} else if (mouseX > LR) {e.target.x = LR;}
    if (mouseY < LT) {e.target.y = LT;} else if (mouseY > LB) {e.target.y = LB;}
}

在你的函数“mdown”中:

e.currentTarget.addEventListener(Event.ENTER_FRAME, EnterFrame);

在您的函数“mUp”中:

target.removeEventListener(Event.ENTER_FRAME, EnterFrame);

一般方法

这是可以做到的方式。在超出限制的 MOUSE_UP 上,目标是 [object stage]。因此,您必须创建一个变量__last,这将使您识别单击 MOUSE_DOWN 的实例(p1 或其他)。不需要 StartDrag():

const LL:uint = 0;
const LT:uint = 0;
const LR:uint = stage.stageWidth;
const LB:uint = stage.stageHeight;

function EnterFrame(e:Event):void {
    e.target.x = mouseX;
    e.target.y = mouseY;
    if (mouseX < LL) {e.target.x = LL;} else if (mouseX > LR) {e.target.x = LR;}
    if (mouseY < LT) {e.target.y = LT;} else if (mouseY > LB) {e.target.y = LB;}
}

var __last:*;

p1.addEventListener(MouseEvent.MOUSE_DOWN, OnMouseDown);
function OnMouseDown(e:MouseEvent):void {
    __last = MovieClip(e.target);
    __last.addEventListener(Event.ENTER_FRAME, EnterFrame);
}

this.stage.addEventListener(MouseEvent.MOUSE_UP, OnMouseUp);
function OnMouseUp(e:MouseEvent):void {
    if(__last) __last.removeEventListener(Event.ENTER_FRAME, EnterFrame);
}

将其弹回原始位置

const LL:uint = 0;
const LT:uint = 0;
const LR:uint = stage.stageWidth;
const LB:uint = stage.stageHeight;

var __last:*;
var dropIndex:int;

function EnterFrame(e:Event):void {
    if (mouseX < LL || mouseX > LR || mouseY < LT || mouseY > LB) {
        __last.x = positionsArray[dropIndex].xPos;
        __last.y = positionsArray[dropIndex].yPos;
        __last.stopDrag();
    }
}

var hitArray:Array = new Array(hitTarget1, hitTarget2, hitTarget3);
var dropArray:Array = new Array(drop1, drop2, drop3);
var positionsArray:Array = [];

for (var i:int = 0; i < dropArray.length; i++) {
    dropArray[i].buttonMode = true;
    dropArray[i].addEventListener(MouseEvent.MOUSE_DOWN, mdown);
    dropArray[i].addEventListener(MouseEvent.MOUSE_UP, mUp);
    positionsArray.push({xPos:dropArray[i].x, yPos:dropArray[i].y});
}

function mdown(e:MouseEvent):void {
    __last = e.currentTarget;
    dropIndex = dropArray.indexOf(__last);
    setChildIndex(MovieClip(__last), numChildren - 1);
    __last.startDrag();
    addEventListener(Event.ENTER_FRAME, EnterFrame);
}

function mUp(e:MouseEvent):void {
    if (__last.hitTestObject(hitArray[dropIndex])) {
        __last.x = hitArray[dropIndex].x;
        __last.y = hitArray[dropIndex].y;
    } else {
        __last.x = positionsArray[dropIndex].xPos;
        __last.y = positionsArray[dropIndex].yPos;
    }
    __last.stopDrag();
    removeEventListener(Event.ENTER_FRAME, EnterFrame);
}

【讨论】:

  • -谢谢,我尝试了第一种方法,它不起作用,遗憾的是它可以检测到鼠标移出但不能将其弹回原始位置...
  • @multiverse:保存项目开始移动时的位置,并将其存储为“_originalPosition = mc.
  • @DanielMesSer - 尝试使用 -startXZ = event.target.x; startYZ = event.target.y; stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveA);函数 mouseLeaveA(e:Event) :void { event.target.stopDrag(); event.target.x = startXZ; event.target.y = startYZ; stage.removeEventListener(Event.MOUSE_LEAVE, mouseLeaveA); } 但它搞乱了所有的位置,就像它在离开舞台时将它们弹回,但是当离开舞台时所有对象只是相互重叠......你能指导一下
  • @helloflash - 非常感谢,我会尽力回复您,再次感谢您在这里的时间和耐心...
  • @helloflash - 非常感谢,这太完美了,我只需要一个小帮助,我创建了一个计时器让用户在 10 秒内将对象放在正确的位置,现在一切效果很好,但是当计时器结束时,我将控件发送到失败的帧,但是在那里,移动的影片剪辑出现在顶部,因为设置的索引为-1,当我回到原始帧时,它们堆叠在一个帧上另一个然后当我由于重复的值而移动它们时它们给出错误,我怎样才能使设置的索引正常-
猜你喜欢
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2011-01-19
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多