Actionscript 3 AS3库是否具有具有非矩形边界(即:圆形)的startDrag()等效项?

Actionscript 3 AS3库是否具有具有非矩形边界(即:圆形)的startDrag()等效项?,actionscript-3,draggable,bounds,Actionscript 3,Draggable,Bounds,我只是想避免使用自己的拖动功能。是否有人知道有任何库具有类似的startDrag(),您可以使用圆形半径作为拖动边界,而不是矩形框?没有,您需要进行像素完美碰撞(或者在本例中,单击鼠标)才能做到这一点。本质上,所有显示对象始终具有矩形边界。因此,基本上你必须这样做: mySprite.addEventListener(MouseEvent.MOUSE_DOWN, mousedDown); function mousedDown(e:MouseEvent):void { //Draw m

我只是想避免使用自己的拖动功能。是否有人知道有任何库具有类似的
startDrag()
,您可以使用圆形半径作为拖动边界,而不是矩形框?

没有,您需要进行像素完美碰撞(或者在本例中,单击鼠标)才能做到这一点。本质上,所有显示对象始终具有矩形边界。因此,基本上你必须这样做:

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值是什么,还必须说明绘制位图时精灵的原点在哪里。假设你有一个精灵,里面有内容,你需要创建一个X和Y偏移量为负的矩阵对象。5倍于精灵宽度才能正确绘制它。

不,你需要进行像素完美碰撞(或者在本例中,单击鼠标)才能做到这一点。本质上,所有显示对象始终具有矩形边界。因此,基本上你必须这样做:

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值是什么,还必须说明绘制位图时精灵的原点在哪里。假设您有一个精灵,并且里面有内容,您需要创建一个X和Y偏移为负的矩阵对象。5倍于精灵宽度才能正确绘制它。

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

a) 鼠标向下:存储开始位置。开始收听输入帧

b) 输入\帧:检查从鼠标位置到起始位置的距离(使用毕达哥拉斯)

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

d) 鼠标悬停:停止收听enterframe(用于圆形拖动区域)-您需要做的是:

a) 鼠标向下:存储开始位置。开始收听输入帧

b) 输入\帧:检查从鼠标位置到起始位置的距离(使用毕达哥拉斯)

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


d) 鼠标向上:停止收听enterframe

您可以使用一个简单的圆形碰撞检测例程,它使用对象的半径和对象之间的距离计算出碰撞区域。也许您必须在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;
var deltax:Number=targetCentreCoord.x-hitTestCentreCoord.x;
var deltay:Number=targetCentreCoord.y—hitTestCentreCoord.y;
//计算出我们的圆是否相撞,圆之间的距离包括半径

如果(((deltax*deltax)+(deltay*deltay))您可以使用一个简单的圆形碰撞检测例程,它会使用对象的半径和对象之间的距离计算出碰撞区域。也许您必须使用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;
var deltax:Number=targetCentreCoord.x-hitTestCentreCoord.x;
var deltay:Number=targetCentreCoord.y—hitTestCentreCoord.y;
//计算出我们的圆是否相撞,圆之间的距离包括半径

如果((deltax*deltax)+(deltay*deltay))则无需输入帧事件即可完成此操作。 让一个鼠标向下的监听器,检查边界,如果在边界内,则 添加鼠标移动侦听器。
另外,从鼠标启动侦听器开始,删除鼠标移动侦听器。

这可以在无需输入帧事件的情况下完成。 让一个鼠标向下的监听器,检查边界,如果在边界内,则 添加鼠标移动侦听器。
另外,从鼠标移动监听器开始删除鼠标移动监听器。

嘿,谢谢你的评论。我想我一定不是很清楚我在问什么。有问题的边界不是用来确定对象的命中区域(顺便说一句,这是自动完成的)。它是关于我可以将对象拖动到的边界!即:startDrag(lockCenter:Bool,bounds:Rect)。指定边界时,必须指定一个不能拖动对象的Rect(它只是停止拖动)。这是我想要的行为,但我希望边界是一个圆形区域,而不是矩形区域。这与碰撞无关。哈哈哈哈,好吧,很抱歉。如果我能想到或找到任何东西,我会发布一个新的答案。嘿,谢谢你的评论。我想我一定不是很清楚我在问什么。questio中的边界n不是用来确定对象的命中区域(顺便说一句,这是自动完成的)。它是关于我可以将对象拖动到的边界!即:startDrag(lockCenter:Bool,bounds:Rect)。指定边界时,必须指定一个不能拖动对象的Rect(它只是停止拖动)。这是我想要的行为,但我希望边界是一个圆形区域,而不是矩形区域。这与碰撞完全无关。Ohhhhhhhhh lol好的,很抱歉。如果我能想到或找到任何东西,我将发布一个新的答案。请参阅以下循环拖动的问题和答案:。请参阅以下循环拖动的问题和答案:。请参阅以下问题和答案r拖动:。再次抱歉,此问题中不涉及碰撞。您需要执行碰撞检测以检测与问题中的边界的碰撞,然后您将停止拖动。除非我误解了您的问题。Fraid是这样的,我没有命中任何东西。只需限制拖动的边界。AS3本机执行此操作,但仅限于矩形边界框,而不是圆形边界框。同样,这个问题专门要求一个库,而不是一个自主开发的解决方案。自主开发的方法很简单,但库会抓住所有的优势