2011-07-27 46 views
1

我只是想尽量避免滚动我自己的拖动功能。有没有人知道任何有相当于startDrag()的图书馆,你可以使用圆形半径作为拖拽边界,而不是矩形框?具有与非矩形边界(即:圆形)等效的startDrag()的AS3库?

+0

请参见下面的问题和答案以进行循环拖动:将[约束MovieClip拖动到一个圆](http://stackoverflow.com/questions/6509716/constrain-movieclip-drag-to-a-circle/6510032#6510032) 。 –

回答

1

(对于圆形阻力区) - 你需要做的是:

一)MOUSE_DOWN:商店开始位置。开始收听Enter_frame。

b)中ENTER_FRAME:从鼠标位置检查距离的鼠标来启动POS(使用毕达哥拉斯)

c)中只有当距离小于x

d移动您的对象)MOUSE_UP:停止听输入框

+0

是的,这就是我所说的“滚我自己”的意思,是我会采取的方法。在最初的问题中,我问是否有人知道任何已经完成这个工作的图书馆。我会将问题留给开放一段时间,如果没有人使用内置此库的表面,我会接受您的答案。 –

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

注意这仅仅是伪代码,你就必须要弄清楚的单元值透明事情的发生,同时也你必须考虑绘制到位图时,精灵的起始点在哪里。假设你有一个精灵,内容在里面,你需要创建一个Matrix对象,它的X和Y偏移量是你的精灵宽度的0.5倍,以便正确绘制它。

+0

嗨,感谢您的评论。我想我的问题一定不太清楚。有问题的边界并不意味着确定对象的命中区域(通过这种方式自动完成)。这是关于我可以拖动对象的边界!即:startDrag(lockCenter:Bool,bounds:Rect)。当你指定边界时,你必须指定一个Rect,超过该Rect你不能拖动对象(它只是停止拖动)。这是我期望的行为,但我希望边界是一个圆形的区域,而不是一个矩形区域。它根本不需要处理碰撞。 –

+0

Ohhhhhhhh大声笑没关系对此感到抱歉。如果我能想到或找到任何东西,我会发布一个新的答案。 – 2011-07-27 05:52:17

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; 
+0

再一次,对不起,这个问题没有涉及碰撞。 –

+1

你需要做碰撞检测来检测你的问题中的边界,然后你会停止拖动。除非我误解你的问题。 – serenskye

+0

因此,我没有碰到任何东西。只需要限制拖动的边界。 AS3本身可以做到这一点,但只有一个矩形边界框,而不是圆形边界框。同样,这个问题特别要求图书馆,而不是本土解决方案。本土方法很简单,但图书馆可以捕捉到所有边缘案例,这就是我问的原因。 –

-1

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