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

もちろん、これは最初に最も近い要素のみを取得するため、2つの要素が等距離にある場合に何を実行するかを決定する必要があります。

また、要素の起源を考慮する必要があります。おそらく左上に原点が設定されているので、距離の計算でこれを考慮する必要があります。

最小距離を確認することもできます。したがって、ユーザーがいずれかの要素から離れすぎている場合は、何もしません。

于 2011-05-29T21:22:30.133 に答える
1

必要なのが最も近いグリッドの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];

配列を作成してその中にアイテムをプッシュする方法に注意を払っていれば、検索せずにデータを取得することは問題ありません。

于 2011-05-29T21:35:39.423 に答える