I don't know what you're doing, but it's not what I described. Here's some code that does do what I described.
Note that this does not prevent one object from being pushed into another, but you could extend the enterframe to compare each object with each other object to do that but it would be an n^2 process rather than n.Code:package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Main extends Sprite { private var draggable:Sprite; private var pushables:Vector.<Sprite> = new Vector.<Sprite>(); public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point for (var i:int = 0; i < 10; i++) { var p:Sprite = makePushable(); addChild(p); pushables.push(p); } addEventListener(Event.ENTER_FRAME, doFrame); } private function makePushable():Sprite { var p:Sprite = new Sprite(); p.graphics.beginFill(Math.random() * 0xffffff); p.graphics.drawCircle(0, 0, 5 + Math.random() * 20); p.graphics.endFill(); p.addEventListener(MouseEvent.MOUSE_DOWN, beginDrag); p.addEventListener(MouseEvent.MOUSE_UP, endDrag); p.x = Math.random() * stage.stageWidth; p.y = Math.random() * stage.stageHeight; return p; } private function doFrame(e:Event):void { if (draggable) { for (var i:int = 0; i < pushables.length; i++) { var p:Sprite = pushables[i]; if (p == draggable) { continue; //don't compare to self } if (draggable.hitTestObject(p)) { var angle:Number = Math.atan2(p.y - draggable.y, p.x - draggable.x); var widthsum:Number = (draggable.width + p.width)/2; p.x = draggable.x + Math.cos(angle) * widthsum; p.y = draggable.y + Math.sin(angle) * widthsum; } } } } private function beginDrag(e:MouseEvent):void { if (draggable) { draggable.stopDrag(); } draggable = Sprite(e.currentTarget); draggable.startDrag(); } private function endDrag(e:MouseEvent):void { draggable.stopDrag(); draggable.stopDrag(); } } }




Reply With Quote