2011-05-29 51 views
0

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

回答

0

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

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

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

现在问题来了。如果您将它们存储在二维数组中,那么如果将它们存储在一个平面数组(1d)中,则需要查看它,就像创建它一样。

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

如果你照顾你如何创建阵列,并且在推的项目,应该找回的东西,而搜索是没有问题的。

+0

最后,我用hittest来检测droptarget。我无法直接使用鼠标X,因为网格也是缩放的,因此鼠标X不再对应网格坐标,因为无论如何这个简单的解决方案。 – algro 2011-05-29 22:21:38

2

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

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

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

您还需要考虑元素的起源。将可能有起源设置在那里左上角,所以你需要允许这个在你的距离计算。

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

+0

感谢这个解决方案,其中一个,使用hittestObject对我来说更容易一些。 – algro 2011-05-29 22:24:42