捕捉到特定的网格位置

时间:2012-07-03 09:58:07

标签: xna

我有一个网格系统,可以让我将对象捕捉到网格中,并且完美无缺,但这并不是我在这种情况下寻找的行为。我不能为我的生活把它写成任何有意义的文字(可能是我为什么不能把头缠在它周围......)所以我想出了一张当前行为和预期的图片行为会做得更好:

grid

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

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

在预期的行为中,如果配对值与它相反,对象将始终捕捉到网格 - 如果X是ODD,那么Y值必须是偶然的,它要捕捉,反之亦然(即[0, 1],[1,0],[2,3])。对象不会与[0,0],[1,1],[4,2]对齐,因为它们都是ODD或两者都是偶然的。我注意到的一些事情与我所寻找的行为是一致的,但无法将其转化为有用的行为。

这里是整个网格代码:

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

1 个答案:

答案 0 :(得分:0)

这比看起来应该有点棘手,因为你在x中捕捉的方式取决于你在y(和vise verse)中的捕捉方式。我认为我这样做的方法是先用2x tileHeight和tileWidth来确定你使用上面发布的代码的哪个方格。一旦你有了你的点所在的方格,你可以使用一些if条件来确定鼠标最接近的边缘。

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

无论哪个对你更有意义......最好!