找到最靠近鼠标位置的点

时间:2011-05-29 20:59:57

标签: actionscript-3 grid coordinates point mouse-position

我有一个精灵网格。 现在我想在网格元素上拖动图像。 因此,我需要知道哪个x / y的网格元素是最靠近鼠标位置的点。 所有网格元素都存储在一个数组中。 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

您必须遍历所有元素并找到与鼠标的最小距离。然后存储元素的数组索引。尝试这样的事情:

// Setup variables outside of loop.
var mousePoint:Point = new Point(mouseX, mouseY);
var elementPoint:Point = new Point();
var element:Sprite;
var closestIndex:uint = 0;
var closestDist:Number;

// Loop through elements
for (var i:int = 0; i < gridElements.length; i++) 
{
    element = gridElements[i] as Sprite;

    // Set the elementPoint's x and y rather than creating a new Point object.
    elementPoint.x = element.x;
    elementPoint.y = element.y;

    // Find distance from mouse to element.
    var dist:Number = Point.distance(mousePoint, elementPoint);

    // Update closestIndex and closestDist if it's the closest.
    if (i == 0 || dist < closestDist) 
    {
        closestDist = dist;
        closestIndex = i;
    }
}

// Can now use closestIndex to get the element from the array.
trace('The closest element is at index', closestIndex, ', with a distance of', closestDist);

当然,这只会让你获得第一个最接近的元素,所以如果两个元素距离相等,你必须决定你想要发生什么。

您还需要允许元素的来源。可能会将原点设置为左上角,因此您需要在距离计算中允许这样做。

您还可以检查最小距离。因此,如果用户拖动距离任何元素太远,则不执行任何操作。

答案 1 :(得分:0)

如果您需要的是最近网格的x,y,那么您只需要做的就是。

var gridX:int = Math.floor(mouseX / NumberOfColumns);
var gridY:int = Math.floor(mouseY / NumberOfRows);

这会将鼠标坐标转换为网格坐标。

现在出现了问题。如果你将它们存储在一个二维数组中,那么如果你将它们存储在一个平面阵列(1d)中,那么你就有x / y,你需要像创建它一样查找它。

var myObject:Object = my2dArray[gridX, gridY];
var myObject:Object = myFlatArray[(gridX * NumberOfRows) + gridY];

如果你已经注意了如何创建阵列并推送其中的项目,那么在不搜索的情况下检索内容应该没有问题。