0

オブジェクトをグリッドにスナップできるようにレイアウトされたグリッド システムがあり、それは完全に正常に動作しますが、この状況で探している動作ではありません。私の人生では、これを意味のある言葉で表現することはできませんでした(おそらく、頭を包むのに苦労している理由です...)。はるかに良い仕事:

グリッド

左側は現在の動作を示しています (注: グリッド システムは、実際には上に示した白いグリッド ラインの 2 倍の大きさです。これにより、オブジェクトをグリッド ライン上に配置できます。これは、私が探している意図した動作です。)

右側は、オブジェクトをグリッドにスナップする方法です。オブジェクトをグリッド ノード (または空白の中央ノード) ではなく、グリッド ラインにのみ配置したい。

予想される動作では、ペアの値が反対の場合、オブジェクトは常にグリッドにスナップします。X が ODD の場合、Y の値は偶数でなければスナップできません。 [1, 0]、[2,3])。オブジェクトは [0,0]、[1,1]、[4, 2] にスナップしません。これらは両方とも ODD または両方とも EVEN であるためです。私が探していた動作と一致していることに気付きましたが、これを有用なものに変換することはできませんでした.

全体のグリッドコードへのスナップは次のとおりです。

//Grab the mouse state
MouseState mouse = Mouse.GetState();

//TileX = (int)Math.Floor((float)(mouse.X / tileWidth));  //tileWidth = 80
//TileY = (int)Math.Floor((float)(mouse.Y / tileHeight)); //tileHeight = 80

//We want "snap to closest grid space" instead of "snap to next-lowest grid space", 
//like the Math.Floor code does above. The ".ToInt()" extensions simply rounds a 
//float to the closest integer. i.e. 2.2 = 2     2.5 = 3    3 = 3
TileX = ((float)mouse.X / tileWidth).ToInt();
TileY = ((float)mouse.Y / tileHeight).ToInt();

//Set the square to a whole tile coordinate
squarePosition.X = TileX * tileWidth;
squarePosition.Y = TileY * tileHeight;
4

1 に答える 1

0

これは、x をスナップする方法が y をスナップする方法 (およびその逆) に依存するため、本来あるべきよりも少しトリッキーです。私が行う方法は、最初に、上に投稿したコードを2倍の tileHeight と tileWidth で使用して、どの正方形にいるのかを把握することだと思います。ポイントが内側にある正方形を取得したら、if 条件を使用して、マウスがどのエッジに最も近いかを判断できます。

実際には、原点を中心にポイントを 45 度回転させ、上記のコードで行うようにポイントをスナップし、スナップした位置を元に戻す (反対方向に 45 度) ことによって、閉じた形式のソリューションを導出することもできると思います。

あなたにとってどちらがより理にかなっていますか...最高です!

于 2012-07-03T13:17:50.063 に答える