0

我布置了一个网格系统,可以让我将对象捕捉到网格,而且效果很好,但这不是我在这种情况下要寻找的行为。我这辈子都无法用任何有意义的语言来表达(可能是为什么我无法理解它......)所以我想出一张具有当前行为和预期行为的图片会做一个更好的工作:

网格

左侧显示当前行为(注意:网格系统实际上是上面显示的白色网格线的两倍。这允许将对象放置在网格线上,这是我正在寻找的预期行为。)

右侧是我希望对象捕捉到网格的方式。我只希望将对象放置在网格线上,而不是网格节点(或空白中心节点)上。

在预期的行为中,如果配对值与其相反,对象将始终捕捉到网格 - 如果 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;
4

1 回答 1

0

这比看起来应该的要复杂一些,因为你如何捕捉 x 取决于你如何捕捉 y(和虎钳诗句)。我认为我这样做的方法是首先使用您在上面发布的代码以及 2x tileHeight 和 tileWidth 来确定您在哪个方格。一旦你有了你的点所在的正方形,你就可以使用一些 if 条件来确定鼠标最接近哪条边。

实际上,我想您也可以通过将点围绕原点旋转 45 度,像在上面的代码中那样捕捉它们,然后将捕捉的位置向后旋转(在另一个方向上旋转 45 度),从而得出一个封闭形式的解决方案。

哪个对您更有意义……最好!

于 2012-07-03T13:17:50.063 回答