Вот я по быстрому наваял пример.

Код AS3:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
public class Main extends Sprite {
private var dragTarget:Sprite;
private var startX:int;
private var startY:int;
public function Main() {
var board:Sprite = new Sprite();
var letters:Array = new Array("d","i","r","t","y","r","o","o","m")
var l:String;
var xPos:uint = 50
var yPos:uint = 100
for each (l in letters) {
var tile:Sprite = new Sprite();
tile = createLetterTile(l as String) // size, color yellow
tile.x = xPos;
tile.y = yPos;
xPos += 50;
board.addChild(tile);
tile.addEventListener(MouseEvent.MOUSE_DOWN, dragStarter, false);
tile.addEventListener(MouseEvent.MOUSE_UP, dragStopper);
tile.addEventListener(Event.MOUSE_LEAVE, dragLeave);
}
addChild(board)
var instructions:TextField = new TextField();
instructions.text = "Re-order the letters to form another word."
instructions.selectable = false;
instructions.mouseEnabled = false;
instructions.x = 20
instructions.y = 20
instructions.width = 300;
addChild(instructions);
}
private function dragStarter(event:MouseEvent):void {
if (event.target is Sprite) {
dragTarget = event.target as Sprite;
startX = dragTarget.x;
startY = dragTarget.y;
dragTarget.startDrag();
}
}
private function dragStopper(event:MouseEvent):void {
dragTarget.stopDrag();
if(dragTarget.hitTestObject(this.obj1) && obj1.busy == null)
{
dragTarget.x = obj1.x;
dragTarget.y = obj1.y;
obj1.busy = true;
obj2.busy = null;
obj3.busy = null;
}
else if(dragTarget.hitTestObject(this["obj2"]) && obj2.busy == null)
{
dragTarget.x = obj2.x;
dragTarget.y = obj2.y;
obj1.busy = null;
obj2.busy = true;
obj3.busy = null;
}
else if(dragTarget.hitTestObject(this["obj3"]) && obj3.busy == null)
{
dragTarget.x = obj3.x;
dragTarget.y = obj3.y;
obj1.busy = null;
obj2.busy = null;
obj3.busy = true;
}
else
{
dragTarget.x = startX;
dragTarget.y = startY;
}
}
private function dragLeave(event:Event):void
{
dragTarget.x = startX;
dragTarget.y = startY;
}
private function createLetterTile(txt:String):Sprite {
var s:Sprite = new Sprite();
var letter:TextField = new TextField();
letter.selectable = false;
var tileBackColor:uint = 0xDBD9A6;
var tileShadowColor:uint = 0x676420;
var tileBorderColor:uint = 0x000000;
s.graphics.beginFill(tileShadowColor);
s.graphics.drawRect(-2, 2, 40, 40);
s.graphics.endFill();
s.graphics.beginFill(tileBackColor);
s.graphics.drawRect(0, 0, 40, 40);
s.graphics.endFill();
s.graphics.lineStyle(1, tileBorderColor, 100);
s.graphics.drawRect(0, 0, 40, 40);
letter.text = txt
letter.selectable = false;
letter.mouseEnabled = false;
letter.x = 14
letter.y = 14
letter.width = 14
letter.height = 16
s.addChild(letter)
return s;
}
}
}
На стейдже лежат три мувиклипа с именами obj1, obj2 и obj3.
Когда курсор с перетаскиваемым объектом уходит за пределы приложения, объект должен возвращаться на исходную позицию, а этого не происходит. И как бы поразумнее проверять сводна ячейка или занята? Да и проверка столкновений не по вкусу - а если ячеек 100? Цикл использовать? Долго же.