我有精灵,当我点击并按住它们时我想要移动它们,当我释放它们时停止它。我有方法将事件侦听器添加到Sprites:
public function layOutEventListeners():void
{
var addSpriteEventListener:Function =
function(spr:Dictionary, index:int, vector:Vector.<Dictionary>)
{
spr["sprite"].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
spr["sprite"].addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}
gridVec.forEach(addSpriteEventListener);
}`
以及处理事件的方法:
public function mouseDownHandler(me:MouseEvent):void
{
trace(me.target.toString());
trace(me.currentTarget.toString());
this.drawSprite(me.target);
this.growByTwo(me.target);
me.stopImmediatePropagation();
me.currentTarget.startDrag(me);
}
public function mouseUpHandler(me:MouseEvent):void
{
trace(me.target.toString());
trace(me.currentTarget.toString());
me.stopImmediatePropagation();
this.originalSize(me.target);
me.currentTarget.stopDrag();
}`
我的问题是:当我点击Sprite时,一旦移动光标,Sprite的注册点就会捕捉到光标,当我释放鼠标时,Sprite不会停留在光标之后。我最初认为这是像素碰撞的问题。我认为光标没有触及MOUSE_UP
上的任何东西,但在我进行实验后证明这是错误的。我甚至通过启动另一个项目来复制完全相同的事件添加和处理方法,并发现我没有遇到这个问题。测试Sprite只是像往常一样拖放,不是捕捉到注册点,而是被我点击的点拖动。
我能看到的唯一区别,也是我唯一的怀疑,是我的原始代码中的精灵被添加到Sprite中,然后被添加到舞台中,而测试项目中的Sprite被添加到根DisplayObject
。我想是以某种方式将事件传播到容器Sprite并拖放它而不丢弃其他Sprite。我看到的奇怪的对齐可能是光标捕捉到另一个精灵后面的对象。另一个重要的事情是:当我将Sprite放在另一个Sprite之上时,Sprite会像我想要的那样停止移动,但仍然会跟踪注册点。
无论如何,我真的很难过,我真的不知道我跑了。有什么想法吗?
答案 0 :(得分:1)
这通常是因为当MOUSE_UP发生时,有时鼠标不在剪辑上,或者是因为其他剪辑妨碍了游戏,或者玩家没有足够快地刷新舞台等等......
我不确定这是你的情况,但无论哪种方式,通常都建议将MOUSE_UP事件分配给舞台,这样你就可以安全地确保它始终被触发。确保通过;)
删除mouseUp处理程序上的监听器spr["sprite"].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
public function mouseDownHandler(me:MouseEvent):void {
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}
public function mouseUpHandler(me:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}
缺点是你在mouseUp上丢失了你的剪辑引用,但是你可以在mouseDown上手动创建一个引用,或者在内部完成整个事情(在sprite的代码中)。