Flash AS3自定义使用MOUSE MOVE事件进行拖动

时间:2009-09-24 03:14:39

标签: actionscript-3 drag-and-drop

我在AS3中创建基于网格的地图渲染器,它会加载所需的PNG图像块并将其渲染到容器中。我已经使用MOUSE_MOVE事件处理程序在此应用程序中应用了滚动/拖动逻辑。我的工作是,

我在MOUSE_DOWN中注册bDragging标志和鼠标位置, 在每个MOUSE_MOVE中,我检查鼠标的位移并相应地移动主地图 取消注册MOUSE_UP中的bDragging标志并将位置设置为NaN。

我的问题是拖拽是非常生涩/不稳定。

任何建议都将不胜感激。以下是我正在使用的示例代码。

function onMouseDown(e:MouseEvent):void
{
     m_bDragging = true;
     m_ptPrevPoint = new Point(e.stageX, e.stageY);
}

function onMouseUp(e:MouseEvent):void
{
     m_bDragging = false;
     m_ptPrevPoint = null;
}
function onMouseMove(e:MouseEvent):void
{
    if(!m_bDragging || null == m_ptPrevPoint)
    return;

var nDiffX:Number = int(e.stageX - m_ptPrevPoint.x);
var nDiffY:Number = int(e.stageY - m_ptPrevPoint.y);

//Make movement smoother 
//nDiffX = nDiffX * 4) / 4;
//nDiffY = nDiffY * 4) / 4;

if(nDiffX != 0 || nDiffY != 0)
{
    trace("X : " + nDiffX + ", Y : " + nDiffY + ", points-Old " + m_ptPrevPoint + ", New " + new Point(e.stageX, e.stageY) );
    m_oCircle.x += nDiffX;
    m_oCircle.y += nDiffY;

    m_ptPrevPoint = new Point(e.stageX, e.stageY);

    e.updateAfterEvent();
}
else
    trace("not moved - X : " + nDiffX + ", Y : " + nDiffY+ ", points-Old " + m_ptPrevPoint + ", New " + new Point(e.stageX, e.stageY)) }

请在此处查看FLA文件...在Flash CS3中制作。请注意,如果鼠标在圆圈上,它会像地狱一样抖动,但如果你从圆圈外面拖动它,它会更顺畅!

Sample FLA

2 个答案:

答案 0 :(得分:2)

谢谢大家,我发现了问题!

实际上这可能是土坯的一些错误,我奇怪地得到一些奇怪的坐标,这就是运动不顺畅的原因。我使用localToGlobal转换了stageX和stageY,一切都变得更加顺畅!!!

现在,我不知道为什么我需要将stageX / stageY转换为全局。 :)我的简短修改如下。

var curPt:Point = DisplayObject(e.currentTarget).localToGlobal(new Point(e.stageX,e.stageY));

var nDiffX:Number = int(curPt.x - m_ptPrevPoint.x);

var nDiffY:Number = int(curPt.y - m_ptPrevPoint.y);

谢谢你们,感谢所有人的帮助。

答案 1 :(得分:0)

我在这方面的答案有帮助吗?

Problems replicating drag-and-drop with mouse events

基本上,当您移动鼠标时,鼠标的坐标有时可能来自预期的不同上下文,具体取决于事件的目标。你需要翻译坐标。