精灵不会停止拖动MOUSE_UP

时间:2011-02-28 23:34:08

标签: flex actionscript-3 mouseevent addeventlistener

我有精灵,当我点击并按住它们时我想要移动它们,当我释放它们时停止它。我有方法将事件侦听器添加到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会像我想要的那样停止移动,但仍然会跟踪注册点。

无论如何,我真的很难过,我真的不知道我跑了。有什么想法吗?

1 个答案:

答案 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的代码中)。