Когда я недавно создал что-то подобное, я просто слушал MOUSE_DOWN и MOUSE_UP, и всякий раз, когда я считал, что была нажата кнопка мыши (то есть между этими двумя событиями, также с учетом Event.MOUSE_LEAVE), я отмечал это так например, используя переменную области действия _mouseIsDown.
Тогда у меня будет обработчик события ENTER_FRAME или таймер, который будет вести себя по-разному в зависимости от того, была ли нажата кнопка или нет.
Когда кнопка мыши нажата, обработчик ENTER_FRAME просто перемещает целевой объект в новое положение мыши. Это также вычтет текущую позицию мыши из предыдущей, чтобы получить вектор скорости. Наконец, он регистрирует текущее положение мыши, чтобы вышеуказанное могло повториться в следующем кадре.
Однако, если кнопка мыши отпущена, она не просто переместит целевой объект, используя отображение 1: 1 в положение мыши, но, скорее, переместит его в соответствии с вектором скорости. Это также уменьшит длину вектора скорости на каждом такте, пока она не станет достаточно близкой к нулю, чтобы вся система была переведена в состояние ожидания для экономии ресурсов.
Упрощенное решение будет выглядеть следующим образом, игнорируя установку и сброс флага mouseIsDown.
private function _handleEnterFrame(ev : Event) : void
{
if (_mouseIsDown) {
// Set speed here, but don't use it while mouse is pressed
_speed.x = stage.mouseX - _prev_mouse_pos.x;
_speed.y = stage.mouseY - _prev_mouse_pos.y;
// Instead, just move target object accordingly
_targetObject.x = stage.mouseX;
_targetObject.y = stage.mouseY;
}
else {
// Mouse is released, meaning that it has been tossed, so move
// object according to speed vector, and decrease speed.
_targetObject.x += _speed.x;
_targetObject.y += _speed.y;
_speed.x *= 0.8;
_speed.y *= 0.8;
// Negligible speed, so stop the processing to save resources
if (_speed.length < 0.05) {
this.removeEventListener(Event.ENTER_FRAME, _handleEnterFrame);
}
}
_prev_mouse_pos.x = stage.mouseX;
_prev_mouse_pos.y = stage.mouseY;
}
Очевидно, вам нужно будет начать прослушивание события ENTER_FRAME при каждом нажатии мыши. Кроме того, вам необходимо иметь соответствующие переменные области действия класса _prev_mouse_pos и _speed, оба экземпляра flash.geom.Point, а также _targetObject, который представляет собой любой экранный объект, на который вы хотите воздействовать путем перетаскивания.