0

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

4

2 回答 2

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

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

您还需要考虑元素的来源。可能会将原点设置在左上角,因此您需要在距离计算中考虑到这一点。

您还可以检查最小距离。因此,如果用户将任何元素拖得太远,则什么也不做。

于 2011-05-29T21:22:30.133 回答
1

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

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

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

现在问题来了。如果您将它们存储在 2d 数组中,那么如果您将它们存储在平面数组 (1d) 中,则您有 x/y,您需要像创建它一样查找它。

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

如果您已经处理好如何创建数组并将项目推送到其中,那么在不搜索的情况下检索内容应该没有问题。

于 2011-05-29T21:35:39.423 回答