Чтобы корректно перетаскивать один объект, вам достаточно запомнить координаты этого объекта (offset) при нажатии мыши. А при движении мыши, устанавливать объект в координаты мыши и отнимать ранее зафиксированные координаты (offset). Так сделайте это для каждого вашего объекта. Создайте массив, в который будете помещать смещение каждого объекта, а потом используйте эти данные.
Во флеше ниже, вы можете выделять объекты или группировать их с помощью ctrl.
Комментарии в коде помогут вам понять, что к чему (по идее).
Только в браузере ctrl не срабатывает (почему не знаю), по этому придётся открыть флешку локально.
Main

Код AS3:
package
{
import flash.display.InteractiveObject;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.geom.Point;
/**
* ...
* @author samana
*/
public class Main extends Sprite
{
//массив с текущими выделенными объектами
private var selectionList:Vector.<Item> = new Vector.<Item>();
//массив с данными о смещении каждого объекта относительно мыши
private var offsets:Vector.<Point> = new Vector.<Point>();
public function Main():void
{
//создаю объекты на сцене
createItems();
//подписыаю сцену на нажатие мыши, чтобы убирать выделение на объектах если оно было.
stage.addEventListener(MouseEvent.MOUSE_DOWN, stage_mouseDown);
//рисую на сцене полоски просто для красоты
graphics.lineStyle(0.5,0xBFBFBD);
for (var i:int = 0; i < 20; i++)
{
graphics.moveTo(0, 25 * i);
graphics.lineTo(800, 25 * i);
}
}
//если клик был по пустом месту на сцене, то убираем выделение с объектов
//и опустошаем массив с выделенными объектами.
private function stage_mouseDown(e:MouseEvent):void
{
if (e.target is Stage)
{
for (var i:int = 0; i < selectionList.length; i++)
{
selectionList[i].selectOff();
}
selectionList.length = 0;
}
}
private function createItems():void
{
//создаю объекты
for (var i:int = 0; i < 20; i++)
{
var item:Item = new Item();
item.x = i * 30;
item.y = i * 25;
//добавляю объект на сцену
addChild(item);
//-------------------------
//каждый объект подписываю на нажатие мыши
item.addEventListener(MouseEvent.MOUSE_DOWN, item_mouseDown);
}
}
//при нажатии по item
private function item_mouseDown(e:MouseEvent):void
{
//текущий item на который нажали мышкой
var item:Item = e.currentTarget as Item;
//если во время нажатия мыши был зажат контрол то
if (e.ctrlKey)
{
//если текущий item ещё не находиться в массиве выделенных объектов, то
//помещаем его в этот массив и подсвечиваем объект (для наглядности)
var ind:int = selectionList.indexOf(item);
if (ind == -1)
{
selectionList.push(item);
item.selectOn();
}
//если же текущий item уже есть в массиве для выделенных объектов, то
//удаляем его из этого массива и убераем подсветку
else
{
selectionList.splice(ind, 1);
item.selectOff();
}
}
//если во время нажатия мыши контрол не зажат
//и текущий объект не находится в массиве, то опустошаем массив
//и заносим в него только один, последний объект, на котором была зажата мышь
else
{
if (selectionList.indexOf(item)== -1)
{
for (var i:int = 0; i < selectionList.length; i++)
{
selectionList[i].selectOff();
}
selectionList.length = 0;
selectionList[0] = item;
item.selectOn();
}
}
//и пробегаемся по массиву с выделенными объектами (не важно сколько их)
//и каждый запонимает текущее смещение каждого item относительно мыши
offsets.length = 0;
for (var j:int = 0; j < selectionList.length; j++)
{
item = selectionList[j];
addChild(item);
offsets[j] = new Point(mouseX-item.x, mouseY-item.y);
}
//пришло время подвисать сцену на движение мыши
stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
//подписываю сцену на отжатие мыши, чтобы удалить MOUSE_MOVE
stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
}
//при движении мыши
private function stage_mouseMove(e:MouseEvent):void
{
var item:Item;
//пробегаемся по массиву с выделенными объектами и
//устанавливаем их в координаты мыши и вычитаем смещение, которое запоминали
//при клике по объектам.
for (var i:int = 0; i < selectionList.length; i++)
{
item = selectionList[i];
item.x = mouseX - offsets[i].x;
item.y = 25 * int((mouseY - offsets[i].y) / 25);
}
}
//при отжатии мыши по сцене, отписываю сцену от события движения мыши,
//чтобы объекты перестали двигаться.
private function stage_mouseUp(e:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
}
}
}
Item

Код AS3:
package
{
import flash.display.Sprite;
import flash.geom.Point;
/**
* ...
* @author samana
*/
public class Item extends Sprite
{
public function Item()
{
selectOff();
}
public function selectOn():void
{
graphics.clear();
graphics.beginFill(0x99EC00);
graphics.lineStyle(1);
graphics.drawRect(0, 0, 70, 25);
graphics.endFill();
}
public function selectOff():void
{
graphics.clear();
graphics.beginFill(0x1DA3CF);
graphics.lineStyle(1);
graphics.drawRect(0, 0, 70, 25);
graphics.endFill();
}
}
}