1

我正在使用 starling 框架,来模拟 onclick 方法,我使用以下代码:

if(e.getTouch(this).phase == TouchPhase.ENDED){
            //Some code
}

没关系,但是如果鼠标不再在按钮上方,它也会触发,但是我希望它仅在它结束时才调度。有什么办法可以做到这一点?谢谢

在代码中,“this”是一个 Sprite,这有点无关紧要

4

3 回答 3

0

简单的方法是使用 starling.display.Button 来做到这一点。他们调度触发事件,这基本上是你想要的。“不太容易”的方法是通过复制 Button 中实际完成的操作来跟踪您的触摸:

    private function onTouch(event:TouchEvent):void
    {
        var touch:Touch = event.getTouch(this);
        if (!mEnabled || touch == null) return;

        if (touch.phase == TouchPhase.BEGAN && !mIsDown)
        {
            //equivalent to MOUSE_DOWN
            mIsDown = true;
        }
        else if (touch.phase == TouchPhase.MOVED && mIsDown)
        {
            // reset button when user dragged too far away after pushing
            var buttonRect:Rectangle = getBounds(stage);
            if (touch.globalX < buttonRect.x - MAX_DRAG_DIST ||
                touch.globalY < buttonRect.y - MAX_DRAG_DIST ||
                touch.globalX > buttonRect.x + buttonRect.width + MAX_DRAG_DIST ||
                touch.globalY > buttonRect.y + buttonRect.height + MAX_DRAG_DIST)
            {
                mIsDown = false;
            }
        }
        else if (touch.phase == TouchPhase.ENDED && mIsDown)
        {
            mIsDown = false;
            //this is a click
            dispatchEventWith(Event.TRIGGERED, true);
        }
    }

您必须更改 buttonRect 代码以反映您的精灵的形状,但基本上就在这里。

于 2013-02-13T09:01:47.830 回答
0

根据文档,如果当前正在触摸目标,则该类的interactsWith(target:DisplayObject)方法应返回 true。我无法测试这个理论,但以下应该有效:TouchEvent

if (e.getTouch(this).phase == TouchPhase.ENDED && e.interactsWith(this)) {
    //The touch ended on the same DisplayObject as it originated at
}
于 2013-02-07T20:34:30.600 回答
0

这个想法怎么样:

if ( e.getTouch( this ).phase == TouchPhase.ENDED ) {
    if ( this.hitTestPoint( stage.mouseX, stage.mouseY, true ) ) {
        // Some code
    }
}
于 2013-02-07T20:44:31.923 回答