如何检查某个位置的物体?

时间:2014-10-21 21:05:36

标签: c# xna xna-4.0

我有一个黑色的targetBox,用于检查它所覆盖的区域是否存在Block对象,例如左上角的灰色对象,如果该位置有Block,则返回一个布尔值。 它是一个瓷砖系统,我已经包含了一个案例,它将返回" false"并且会返回" true"。

This would return false

This would return true

我知道我可以做类似

的事情
public bool checkTargetObjects()
{
    if(block.x == target.x && block.y == target.y) 
    {
        return true;
    }
    else
    {
    return false;
    }
}

但我不确定如何在该位置查找Block对象。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

不是存储切片的X和Y位置,而是将该数据保存为Rectangle。你需要的唯一额外的东西是你的瓷砖的宽度和高度(在某处应该是一个常数)。

所以没有

public class Block 
{
    public int X { get; set; }
    public int Y { get; set; }
}

你可以

public class Block 
{
    public Rectangle Area { get; set; }
}

然后你可以把你所有的块(让我们说你把它们全部放在一个叫List<Block>的{​​{1}}中)并迭代它们以查看哪一块与你的目标相交:

blocks

其中var blocksInTarget = blocks.Where(b => b.Area.Intersects(target.Area)); 是你的矩形。

如果您只想知道是否有矩形(而不是哪个),您可以将Area更改为Where,您可以将其读作&#34;如果有,则返回true是任何与我的目标相交的块#34; :

Any

答案 1 :(得分:0)

您可以创建比较双重功能,如

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

这允许容忍度仅获得完全匹配,这对于dobules来说是罕见的! 然后,您将在每个对象的x和y维度上使用该函数(如果有人使用3D,则使用z)。如果每个维度的容差存在显着差异,您甚至可以将THRESH作为参数。