1

我只是想避免滚动我自己的拖动功能。有谁知道那里有任何startDrag()等效的库,您可以在其中使用例如圆形半径作为拖动边界,而不是矩形框?

4

4 回答 4

1

(对于圆形拖动区域) - 你需要做的是:

a) Mouse_down:存储起始位置。开始收听 Enter_frame。

b) Enter_Frame:检查从鼠标位置到开始位置的距离(使用毕达哥拉斯)

c) 仅当距离小于 x 时才移动对象

d) Mouse_up:停止收听enterframe

于 2011-07-27T06:13:29.017 回答
1

您可以使用简单的圆形碰撞检测例程,它使用对象的半径和它们之间的距离计算出碰撞区域。也许您将不得不在 onDrag 方法中手动执行此计算,并在与下面计算的圆形边界发生碰撞时停止拖动。

        var deltax : Number = targetCentreCoord.x - hitTestCentreCoord.x;
        var deltay : Number = targetCentreCoord.y - hitTestCentreCoord.y;

        //works out if our circles are colliding, distance between the circles inc radius               
        if (((deltax * deltax) + (deltay * deltay)) <= ((((targetRadius) + (hitTargetRadius)) * ((targetRadius) + (hitTargetRadius))))) 
        {
            Log.info("collision occured with " + candidate.name + " target coords " + targetCentreCoord + " candidate coords " + hitTestCentreCoord);
            return true;
        } 
        return false;
于 2011-07-27T15:04:01.663 回答
0

不,您需要进行像素完美的碰撞(或者在这种情况下,单击鼠标)才能做到这一点。从本质上讲,所有显示对象始终具有矩形边界。所以基本上你必须做这样的事情:

mySprite.addEventListener(MouseEvent.MOUSE_DOWN, mousedDown);

function mousedDown(e:MouseEvent):void
{
    //Draw my sprite to a bitmap, then check the bitmap colour at mouseX/mouseY
    uint colour = myBitmap.getPixel32(mouseX, mouseY);
    if(colour != TRANSPARENT){
        //We've actually clicked on the object, drag it
        Sprite(e.currentTarget).startDrag();
    }
}

请注意,这只是伪代码,您必须弄清楚透明的 uint 值是什么,并且在绘制位图时,您还必须考虑精灵的原点在哪里。假设您有一个精灵并且内容在里面,您将需要创建一个 Matrix 对象,该对象的 X 和 Y 偏移量是精灵宽度的 0.5 倍,以便正确绘制它。

于 2011-07-27T04:33:23.113 回答
-1

这可以在没有 ENTER_FRAME 事件的情况下完成。有一个 MOUSE_DOWN 侦听器,检查那里的边界,如果在边界内,则添加一个 MOUSE_MOVE 侦听器。此外,从 MOUSE_UP 侦听器开始删除 MOUSE_MOVE 侦听器。

于 2015-06-17T01:59:25.263 回答