2014-09-05 3 views
1

Я хотел бы сделать draggable movieclip target другой мувиклип (drop target).Простое перетаскивание в цель as3

Не нужно иметь функцию повторного использования (т. Е. Event.target необязательно), и она не должна быть частью массива.

Не могу понять, почему приведенный ниже код не будет работать. Я попытался использовать символ назначения (=) вместо equals (==) в местах, но это не имеет никакого значения.

Любая обратная связь очень ценится.

//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; 
    } 
} 

ответ

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); 
+0

Извините, кажется, что этот код появляется в окне отладки как причина ошибки Появляется сообщение 1009. В рамках успешной функции возврата моя временная шкала перескакивает (gotoAndPlay). С этого момента в любой момент, когда я нажимаю сцену (или что-либо на ней) в SWF, вывод говорит мне, что у меня ошибка 1009 и указывает на функция отбрасывания. Консоль Debug указывает на конкретную строку, которая в вашем примере кода выше - строка «if». Честно говоря, я столкнулся с этим в другом файле, поэтому решил начать заново. Любые советы приветствуются. – hangoJango

+0

Кстати, я проследил все в этом разделе «если» функции капли. Ничто не появилось как null. – hangoJango

+0

yay! нашли ответ (но я не знаю теории, лежащей в его основе). Мне нужно было расширить объекты перетаскивания (my_mc2 и target_mc2 в приведенном выше примере) на временной шкале, чтобы они все еще существовали, когда позже был нажат этап. Чтобы обойти это, я просто установил для их видимого свойства значение false. Это кривая обучения! – hangoJango

0

Я отвечаю на мой собственный вопрос с альтернативным кодом - хотя он до сих пор не ясно, почему предыдущий код не будет работать. Я думаю, это имеет какое-то отношение к любому из этих: if (my_mc2.x == target_mc2.x & & 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; 
    } 
} 
+0

Для тех, кто читает это позже, я пошел с предложением от helloflash, но и должны были создайте ограничительную рамку и убедитесь, что мои объекты перетаскивания расширены в остальной части временной шкалы. В противном случае файл столкнулся с проблемами. См. комментарии выше. – hangoJango

0

еще раз спасибо за приветствие helloflash.

Просто хотел, чтобы обновить эту тему для тех, кто еще пытается это ....

когда вы проверить это, если вы перетащите объект выключен (или прикосновение) к краю сцены, он больше не переставляет себя к его исходным координатам.

Чтобы обойти это, создайте ограничивающий прямоугольник, чтобы ограничить его перемещение. Этот ящик будет меньше, чем на сцене. Точные размеры потребуют проб и ошибок для вашего проекта. Это легко сделать, хотя. Добавить новый прямоугольник внутри второго свойства startDrag (ложь, новый прямоугольник (StartX, starty, rectanglewidth, rectangleheight), например так:

function drag(e:MouseEvent):void { 
e.target.startDrag(false, new Rectangle (200, 200, 600, 300)); 
} 
Смежные вопросы