【问题标题】:Sprites don't stop dragging on MOUSE_UP精灵不会停止在 MOUSE_UP 上拖动
【发布时间】:2011-02-28 23:34:08
【问题描述】:

我有想要在单击并按住它们时移动并在释放它们时停止的精灵。我有将事件侦听器添加到 Sprite 的方法:

    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();
    }`

我的问题是:当我点击精灵时,只要我移动光标,精灵的注册点就会捕捉到光标,当我松开鼠标时,精灵不会停止跟随光标。我最初认为这是像素碰撞的问题。我以为光标在MOUSE_UP 上没有碰到任何东西,但在我实验后证明是错误的。我什至通过启动另一个项目复制了完全相同的事件添加和处理方法,发现我没有遇到这个问题。测试 Sprite 只是像往常一样简单地拖放,没有捕捉到注册点,而是被我点击的点拖动。

我能看到的唯一区别,也是我唯一的怀疑是,我的原始代码中的 Sprite 被添加到 Sprite,然后被添加到舞台中,而测试项目中的 Sprite 正在被添加到根DisplayObject。我在想,事件以某种方式传播到容器 Sprite 并拖放它而不丢弃另一个 Sprite。我看到的奇怪捕捉可能是光标捕捉到另一个精灵后面的对象。另一件重要的事情:当我将一个 Sprite 放在另一个 Sprite 上时,该 Sprite 会停止移动,但仍会跟踪注册点。

不管怎样,我真的很难过,我真的不知道我跑过来了。有什么想法吗?

【问题讨论】:

    标签: apache-flex actionscript-3 mouseevent addeventlistener


    【解决方案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 上手动创建一个引用,或者在内部完成整个操作(在精灵的代码中)。

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多