我布置了一个网格系统,可以让我将对象捕捉到网格,而且效果很好,但这不是我在这种情况下要寻找的行为。我这辈子都无法用任何有意义的语言来表达(可能是为什么我无法理解它......)所以我想出一张具有当前行为和预期行为的图片会做一个更好的工作:
左侧显示当前行为(注意:网格系统实际上是上面显示的白色网格线的两倍。这允许将对象放置在网格线上,这是我正在寻找的预期行为。)
右侧是我希望对象捕捉到网格的方式。我只希望将对象放置在网格线上,而不是网格节点(或空白中心节点)上。
在预期的行为中,如果配对值与其相反,对象将始终捕捉到网格 - 如果 X 为奇数,则 Y 值必须为偶数才能捕捉,反之亦然(即 [0, 1], [1, 0], [2,3])。对象不会对齐到 [0,0]、[1,1]、[4, 2],因为它们都是奇数或偶数。只是我注意到与我正在寻找的行为一致但无法将其转化为任何有用的东西。
这是整个网格代码的快照:
//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;