Flash 当电影剪辑改变位置时是否有事件发生?
我希望在MovieClip改变位置时得到通知,不管位置是由我的代码还是由内置的拖动操作改变的。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
有这样的事件吗 没有内置的。您基本上有两个主要选项: 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位置…将此标记为答案,因为它最接近我最后要做的事情。:)将此标记为答案,因为它与我最后所做的最接近。:)