我只是想避免滚动我自己的拖动功能。有谁知道那里有任何startDrag()
等效的库,您可以在其中使用例如圆形半径作为拖动边界,而不是矩形框?
问问题
876 次
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 回答