Есть ли событие, когда MovieClip меняет положение? - PullRequest
1 голос
/ 11 марта 2011

Я хотел бы получать уведомления, когда мувиклип изменяет позицию, независимо от того, была ли позиция изменена моим кодом или встроенными операциями перетаскивания. Есть ли такое событие?

Ответы [ 2 ]

4 голосов
/ 11 марта 2011

Там нет встроенного. У вас есть в основном 2 основных варианта:

1) Либо повторно опрашивать, чтобы проверить, изменилась ли позиция. 2) Создайте новый класс, который расширяет MovieClip и переопределите свойства 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, который будет содержать обновленную позицию, если вы тоже этого хотели.

2 голосов
/ 11 марта 2011

+ 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;
    }

}

}

но это работает:)

было бы неплохо централизовать дельта-проверки в классе, который дал бы возможность регистрировать / отменять регистрацию клипов и объектов DisplayObject по мере необходимости.

...