我想制作一个可拖动的movieclip目标另一个movieclip(放置目标)。
它不需要具有可重用的功能(即event.target不需要),并且它不需要是数组的一部分。
我无法理解为什么下面的代码无法正常工作。我尝试在地方尝试使用赋值符号(=)而不是等号(==),但这没有区别。
任何反馈都非常感谢。
//Creating variables to store original x/y position of draggable movieclip (my_mc2):
var startX:Number;
var startY:Number;
//Enabling hand cursor over draggable mc:
my_mc2.buttonMode = true;
//Adding event listeners for mouse up and mouse down.
my_mc2.addEventListener(MouseEvent.MOUSE_DOWN, drag);
my_mc2.addEventListener(MouseEvent.MOUSE_UP, drop);
//Drag function (mouse down):
function drag(event:MouseEvent):void {
startX = my_mc2.x;
startY = my_mc2.y;
my_mc2.startDrag();
}
//Drop function (mouse up):
function drop(event:MouseEvent):void {
my_mc2.stopDrag();
if (my_mc2.x == target_mc2.x && my_mc2.y == target_mc2.y) {
my_mc2.removeEventListener(MouseEvent.MOUSE_DOWN, drag);
} else {
my_mc2.x == startX;
my_mc2.y == startY;
}
}
答案 0 :(得分:1)
您希望target_mc2
成为my_mc2
目标。 my_mc2
和target_mc2
几乎没有机会获得完全相同的坐标。因此,您应该决定target_mc2
周围的区域。
my_mc2.buttonMode = true;
var startX:int = my_mc2.x;
var startY:int = my_mc2.y;
const D:int = 20;
function drag(e:MouseEvent):void {
e.target.startDrag();
}
function drop(e:MouseEvent):void {
stopDrag();
if (my_mc2.x > target_mc2.x - D && my_mc2.x < target_mc2.x + D && my_mc2.y > target_mc2.y - D && my_mc2.y < target_mc2.y + D) {
my_mc2.x = target_mc2.x;
my_mc2.y = target_mc2.y;
} else {
my_mc2.x = startX;
my_mc2.y = startY;
}
}
my_mc2.addEventListener(MouseEvent.MOUSE_DOWN, drag);
addEventListener(MouseEvent.MOUSE_UP, drop);
答案 1 :(得分:0)
我用替代代码回答了我自己的问题 - 尽管我仍然不清楚为什么以前的代码不起作用。我想这与其中任何一个有关: if(my_mc2.x == target_mc2.x&amp;&amp; my_mc2.y == target_mc2.y).... my_mc2.x == startX; my_mc2.y == startY;
无论如何,对于任何其他AS3新手来说,寻找一个简单的解决方法,这对我有用。 (是的,这是一种可重复使用的功能,更好的做法。)
circleMC.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
circleMC.addEventListener(MouseEvent.MOUSE_UP, dropIt);
circleMC.startX = circleMC.x;
circleMC.startY = circleMC.y;
circleMC.buttonMode = true;
function pickUp(event:MouseEvent):void{
// no longer need to keep track of startX & startY here as already been done above
event.target.startDrag(true);
}
function dropIt(event:MouseEvent):void{
event.target.stopDrag();
// check to see if the event target is touching target_mc using hitTestObject
if(event.target.hitTestObject(target_mc)){
event.target.buttonMode = false;
event.target.removeEventListener(MouseEvent.MOUSE_DOWN, pickUp);
}
else
// move back to original position
{
circleMC.x = circleMC.startX;
circleMC.y = circleMC.startY;
}
}
答案 2 :(得分:0)
再次感谢helloflash你的答案。
只是想为其他人尝试更新此主题....
当您测试它时,如果您将对象拖离(或触摸)舞台的边缘,它将不再将自身重新定位到其原始坐标。
要解决此问题,请创建一个边界框以限制可以拖动的位置。这个盒子比舞台小。准确的尺寸将需要一些反复试验才能适合您的项目。虽然这很容易做到。在startDrag第二个属性中添加一个新矩形(false,new Rectangle(startx,starty,rectanglewidth,rectangleheight),如下所示:
function drag(e:MouseEvent):void {
e.target.startDrag(false, new Rectangle (200, 200, 600, 300));
}