Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 当电影剪辑改变位置时是否有事件发生?_Flash_Actionscript 3_Movieclip - Fatal编程技术网

Flash 当电影剪辑改变位置时是否有事件发生?

Flash 当电影剪辑改变位置时是否有事件发生?,flash,actionscript-3,movieclip,Flash,Actionscript 3,Movieclip,我希望在MovieClip改变位置时得到通知,不管位置是由我的代码还是由内置的拖动操作改变的。 有这样的事件吗 没有内置的。您基本上有两个主要选项: 1) 或者重复轮询以检查位置是否已更改。 2) 创建一个扩展MovieClip的新类,并重写set x和y属性以触发事件: public class PosNotifyMC extends MovieClip { // the name of the event we're firing public static const M

我希望在MovieClip改变位置时得到通知,不管位置是由我的代码还是由内置的拖动操作改变的。
有这样的事件吗

没有内置的。您基本上有两个主要选项:

1) 或者重复轮询以检查位置是否已更改。 2) 创建一个扩展MovieClip的新类,并重写set 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 ) );
    }

}

如果你的位置变化很大,那么就保留一个本地事件,并反复触发该事件,而不是每次都创建一个新事件。如果需要,还可以创建一个新的事件类来保存更新的位置。

没有内置的事件类。您基本上有两个主要选项:

1) 或者重复轮询以检查位置是否已更改。 2) 创建一个扩展MovieClip的新类,并重写set 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 ) );
    }

}
如果你的位置变化很大,那么就保留一个本地事件,并反复触发该事件,而不是每次都创建一个新事件。如果需要,还可以创建一个新的事件类来保存更新的位置。

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

}

}
但它是有效的:)

最好将增量检查集中在一个类中,这样可以根据需要注册/取消注册剪辑和显示对象。

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

}

}
但它是有效的:)


将增量检查集中在一个类中是一个好主意,这样可以根据需要注册/取消注册剪辑和显示对象。

谢谢,但这似乎只有在我以编程方式设置x和y时才起作用。如果我使用dragStart/dragStop移动剪辑,则不会调用重写的属性。在这种情况下,还需要重写stopDrag()事件。如:override public function stopDrag():void{super.stopDrag();this.dispatchEvent(new Event(PosNotifyMC.MOVED));}如果需要在拖动过程中连续分派,则重写startDrag()方法,设置一个enter frame事件侦听器,它将在FrameDivillysages正确时分派新位置。这就是方法,如果需要,您还可以创建一个自定义事件来处理旧的x和y位置…谢谢,但这似乎只有在我自己以编程方式设置x和y时才起作用。如果我使用dragStart/dragStop移动剪辑,则不会调用重写的属性。在这种情况下,还需要重写stopDrag()事件。如:override public function stopDrag():void{super.stopDrag();this.dispatchEvent(new Event(PosNotifyMC.MOVED));}如果需要在拖动过程中连续分派,则重写startDrag()方法,设置一个enter frame事件侦听器,它将在FrameDivillysages正确时分派新位置。这就是解决问题的方法,如果需要,您还可以创建一个自定义事件来处理旧的x和y位置…将此标记为答案,因为它最接近我最后要做的事情。:)将此标记为答案,因为它与我最后所做的最接近。:)