C# 如何在特定位置检查对象?
我有一个黑色的目标框,用于检查它覆盖的区域是否存在块对象,例如左上角的灰色对象,如果该位置有块,则返回布尔值。 这是一个平铺系统,我已经包括了一个返回“false”和一个返回“true”的例子 我知道我可以做类似的事情C# 如何在特定位置检查对象?,c#,xna,xna-4.0,C#,Xna,Xna 4.0,我有一个黑色的目标框,用于检查它覆盖的区域是否存在块对象,例如左上角的灰色对象,如果该位置有块,则返回布尔值。 这是一个平铺系统,我已经包括了一个返回“false”和一个返回“true”的例子 我知道我可以做类似的事情 public bool checkTargetObjects() { if(block.x == target.x && block.y == target.y) { return true; } else
public bool checkTargetObjects()
{
if(block.x == target.x && block.y == target.y)
{
return true;
}
else
{
return false;
}
}
但我不确定如何在该位置查找块对象。如何执行此操作?您可以创建一个比较双精度函数,如
const THRESH = 1e-3; // define as desired for your application
public bool compareDoubles(double a1, double a2)
{
if( fabs(a1-a2) < THRESH)
return true;
else
return false;
}
const THRESH=1e-3;//根据应用程序的需要定义
公共布尔比较双倍(双a1,双a2)
{
if(晶圆厂(a1-a2)<脱粒)
返回true;
其他的
返回false;
}
这就允许只获得精确匹配,这对于多布勒来说是罕见的!
然后在每个对象的x和y维度上使用该函数(如果有人使用3D,则使用z)。如果每个尺寸的公差存在显著差异,甚至可以将THRESH设置为参数。将该数据保存为一个参数,而不是存储分幅的X和Y位置。你唯一需要的是瓷砖的宽度和高度(在某些地方应该是一个常数) 因此,与其
public class Block
{
public int X { get; set; }
public int Y { get; set; }
}
你可以
public class Block
{
public Rectangle Area { get; set; }
}
然后,您可以获取所有块(假设您在名为块的列表中获得了所有块),并对它们进行迭代,以查看哪个块与目标相交:
var blocksInTarget = blocks.Where(b => b.Area.Intersects(target.Area));
其中,区域
是矩形
如果您只想知道是否有矩形(而不是哪个矩形),可以使用Any
更改Where
,您可以将其理解为“如果有任何块与我的目标相交,则返回true”:
所以你可以检查一个物体是否存在于某个特定的位置,你是在问如何检查一个“块”是否也存在于该位置吗?不,我还没有。我在问如何检查x,y位置是否有东西。块更多地用于上下文,而不是用于平铺的X和Y位置,使用矩形对象。然后你就可以做rect1.Intersect(rect2)我使用的是矩形对象,你建议的看起来非常有用!像targetBox.Intersect(blockBox),但我遇到的问题是,我正在检查任何块,而不仅仅是一个特定的块。像targetBox.Intersect(任何blockBox)谢谢,这真的帮我弄明白了。我定义了交叉点,我想我们会没事的:D@PepperTheDog“我定义了相交”-没有必要为相交编写实现。只需使用Pierre Luc提到的XNA在矩形中提供的一个。
bool isBlockPresent = blocks.Any(b => b.Area.Intersects(target.Area));