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