2011-03-11 16 views

回答

2

+1 @divillysausages :)

那麼你可以做一些骯髒和 「手動」 監測變化。

MovieClip類是動態的,所以我們可以創建變量來存儲最後的X/Y位置,然後在EnterFrame上執行增量。如果增量不爲0,則剪輯已移動。

這真是醜:

package 
{ 
import flash.display.MovieClip; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 

public class Mover extends Sprite 
{ 
    private var mc:MovieClip; 
    public function Mover() 
    { 

     mc = new MovieClip(); 
     mc.graphics.beginFill(0xCC00FF); 
     mc.graphics.drawRect(0, 0, 50, 50); 
     addChild(mc); 

     //storing dynamic properties 
     mc.lx = mc.x; 
     mc.ly = mc.y; 

     //and add monitoring function 
     mc.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); 

     mc.addEventListener(MouseEvent.MOUSE_DOWN, mouseHandler); 
     mc.addEventListener(MouseEvent.MOUSE_UP, mouseHandler); 

     //move clip from outisde 
    // this.addEventListener(Event.ENTER_FRAME, moveClipHandler); 
    } 

    private function moveClipHandler(e:Event):void 
    { 
     mc.x++ 
    } 

    private function mouseHandler(e:MouseEvent):void 
    { 
     switch(e.type) 
     { 
      case MouseEvent.MOUSE_DOWN:   (e.target as MovieClip).startDrag();    break; 
      case MouseEvent.MOUSE_UP:   (e.target as MovieClip).stopDrag();    break; 
     } 
    } 

    private function onEnterFrameHandler(e:Event):void 
    { 
     var m:MovieClip = e.target as MovieClip; 
     //check the delta 
     if (m.x != m.lx || m.y != m.ly) trace('moved!'); 
     m.lx = m.x; 
     m.ly = m.y; 
    } 

} 

} 

,但它的工作原理:)

這將是集中在一個類三角形的檢查,這將使該abilty註冊/註銷剪輯和的DisplayObject是個好主意如所須。

+0

將其標記爲答案,因爲它與我最近做的事情最接近。 :) – 2011-03-11 15:17:03

4

有沒有建在你已經基本上2主要選項:

1)或者查詢反覆檢查,如果位置發生了變化。 2)創建擴展影片剪輯一個新類,覆蓋集x和y屬性觸發事件:

public class PosNotifyMC extends MovieClip 
{ 

    // the name of the event we're firing 
    public static const MOVED:String = "moved"; 

    // override the set x property 
    override public function set x(n:Number):void 
    { 
     super.x = n; 
     this.dispatchEvent(new Event(PosNotifyMC.MOVED)); 
    } 

    // override the set y property 
    override public function set x(n:Number):void 
    { 
     super.x = n; 
     this.dispatchEvent(new Event(PosNotifyMC.MOVED)); 
    } 

} 

如果您的位置改變了很多,然後保持一個本地事件,並多次大火,而不是創建每次都有新的。如果你想要的話,你也可以創建一個新的Event類來保存更新的位置。

+0

謝謝,但這似乎工作,如果我自己設置x和y自己編程。如果我使用dragStart/dragStop移動剪輯,則不會調用覆蓋屬性。 – 2011-03-11 12:22:16

+0

在這種情況下,您還需要重寫stopDrag()事件。如: override public function stopDrag():void { \t super.stopDrag(); \t this.dispatchEvent(new Event(PosNotifyMC.MOVED)); } 如果您需要在拖動時連續調度,則覆蓋startDrag()方法,設置一個輸入框事件偵聽器,它將每幀發送新位置 – divillysausages 2011-03-11 16:56:56

+0

ok,註釋的格式不會「工作:) – divillysausages 2011-03-11 16:59:40

相關問題