найти ближайшую точку к положению мыши - PullRequest
0 голосов
/ 30 мая 2011

У меня есть сетка спрайтов.Теперь я хотел бы перетащить изображение на элемент сетки.Поэтому мне нужно знать, какой х / у элемента сетки является ближайшей точкой к позиции мыши.Все элементы сетки хранятся в массиве.Как мне этого добиться?

Ответы [ 2 ]

3 голосов
/ 30 мая 2011

Вы должны пройтись по всем элементам и найти наименьшее расстояние до мыши.Затем сохраните индекс массива элемента.Попробуйте что-то вроде этого:

// 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 голосов
/ 30 мая 2011

Если все, что вам нужно, это x, y ближайшей сетки, то все, что вам нужно сделать, это.

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

Это преобразует ваши координаты мыши в координаты вашей сетки.Теперь приходит проблема.Если вы храните их в 2d массиве, то у вас есть ваш x / y, если вы храните их в плоском массиве (1d), вам нужно искать его так же, как вы его создали.

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

Еслипозаботившись о том, как вы создаете свой массив и помещаете в него элементы, не должно возникнуть проблем с извлечением материала без его поиска.

...