我的电影剪辑切换位置有问题,当我把它们放在另一个上面时。应该发生的是,影片剪辑应该返回其原始位置,除非我放入我指定的特定位置。当我将它放在一个空白点或指定的丢弃点时,它可以正常工作,只有当我将它放在另一个Movie Clip上时,这两个Movie Clips切换位置并且它们会混乱。
我尝试使用“mouseEnabled = false”禁用所有内容并将其设置回“mouseEnabled = true”,当我将鼠标悬停在任何影片剪辑上但没有响应时。任何人都有线索?
function Placed(e){
if(e.target.hitTestObject(Destination)) {
e.target.stopDrag();
e.target.enabled = false;
e.target.mouseEnabled = false;
}
else {
e.target.x = xPos;
e.target.y = yPos;
e.target.stopDrag();
}
}
这是可以使MC返回其原始位置或坚持指定位置的代码。我认为很清楚MC会在给出代码的情况下应该做什么,所以我不知道为什么当我把它们放在彼此顶部时他们决定换位置。
编辑*:我会将我的整个代码发布在这句话下面,这可能有助于更好地理解它可能出错的地方。这段代码已经有了Vesper和null.point3r的想法,但仍然没有解决问题。
当我将MC放在目的地时,它会留下自己的克隆并禁用拖动的MC。如果我没有将它放在目的地,那么就不会留下任何克隆。我按照MC1,MC2,MC3的顺序创建了3个MC。当我将较旧的MC放在较新的MC上时,它们会切换位置,比如说我将MC1置于MC2或MC3之上,但当我做相反的情况时,说MC3或MC1上面的MC3,没有任何反应,这应该是前者的情况。同样。
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.events.Event;
var xPos:int;
var yPos:int;
var temp = 0;
var Drag:DisplayObject;
//Count for Amount MCs
for (var i=1; i<4; i++)
{
this["Amount" + i].addEventListener(MouseEvent.MOUSE_DOWN, CheckDrag);
this["Amount" + i].addEventListener(MouseEvent.MOUSE_UP, Placed);
this["Amount" + i].buttonMode = true;
}
//Gets original position of selected Amount and allows dragging
function Trace(e){
getPosition(e.target);
e.target.startDrag();
}
//Stores original position of selected/dragged Amount
function getPosition(target:Object):void{
xPos = target.x;
yPos = target.y;
}
//Check if a MC is being dragged
function CheckDrag(e){
if(Drag != null) return;
Drag = e.target;
Trace(e);
}
//Checks if placed in Ledger, returns to original position if false
function Placed(e){
if(Drag == null) return;
//Add Child on Mouse_UP
var Xtra:Class = getDefinitionByName(getQualifiedClassName(e.currentTarget)) as Class;
var Extra:MovieClip = new Xtra();
this.addChildAt(Extra,1);
Extra.x = xPos;
Extra.y = yPos;
//Disable Drag of selected Amount and set position in Desitnation
if(e.target.hitTestObject(Destination)){
e.currentTarget.stopDrag();
e.currentTarget.enabled = false;
e.currentTarget.mouseEnabled = false;
}
//Return Amount to original position and remove Child
else{
e.currentTarget.x = xPos;
e.currentTarget.y = yPos;
e.currentTarget.stopDrag();
removeChild(Extra);
}
Drag = null;
}
答案 0 :(得分:0)
您显然缺少标记指示,这会使您的第二个MC被分配错误的坐标。你需要有一个变量,它包含你现在正在拖动的MC的信息,这样如果有,你的MC的开始拖动代码就不会干扰。您已在某处分配了xPos
和yPos
,并且您的代码是这样的:
function someListener(e:MouseEvent):void {
xPos=e.target.x;
yPos=e.target.y;
e.target.startDrag();
}
您必须首先检查是否有被拖动的对象,如下所示:
var draggedObject:DisplayObject;
function someListener(e:MouseEvent):void {
if (draggedObject!=null) return;
// ^ this means something is being dragged, this clip shouldn't react
draggedObject=e.target;
xPos=e.target.x;
yPos=e.target.y;
e.target.startDrag();
}
然后,一旦您要停止拖动,就清除draggedObject
变量。
function Placed(e){
if (draggedObject==null) return; // safety precaution
if(e.target.hitTestObject(Destination)) {
e.target.stopDrag();
e.target.enabled = false;
e.target.mouseEnabled = false;
}
else {
e.target.x = xPos;
e.target.y = yPos;
e.target.stopDrag();
}
draggedObject=null;
}
PS:您可能希望避免使用经理类,而是将xPos
和yPos
存储在您正在移动的MC上。