检测附近的相同物体

时间:2009-12-22 10:43:54

标签: c#

所以我一次写了一个游戏。只是为了好玩,这样我才能学到新东西。 到目前为止,我已经能够制作一个有效的“突围”和“SpaceInvaders”游戏。所以我知道如何处理碰撞处理等。

现在我想制作一个“泡泡射击”副本。 alt text http://img13.imageshack.us/img13/8361/54611.gif

我希望你们知道这场比赛。

我对游戏的一个方面有疑问。 如你所知,如果彩球击中了一个连接了2个或更多相同颜色球的地方 - 它们将全部“弹出/消失”。

现在,如何检测是否有任何相同颜色的球连接到我碰撞的球上? 我是否保留了所有相同球的冲突的单独列表?

我需要知道不同球的哪个对象的某种暗示,以便我可以在影响时将它们全部删除。

所以是的,我应该怎么做呢?

3 个答案:

答案 0 :(得分:4)

根据我对这类游戏的体验,作为游戏场一部分的泡泡(即那些已被解雇并已落地的泡泡)并未定位任意,而是适合 >明确定义的网格。这使问题不是解决几何问题(这将是繁琐的),而是遍历数据结构。

我建议你有一些东西,可能像二维数组一样简单,代表已经落地的气泡的颜色。一旦确定了新泡泡的位置,就可以检查此阵列中的邻居。您需要注意备用行是偏移的这一事实,但这里没有任何明确的图表无法解决。

(实际上你可能想要任意定位的泡泡!在这种情况下你还有更多工作要做......)

编辑这里有一个存储网格的方法:

我们将使用一个二维数组,按行和列索引,除了处理我们的网格实际上是六边形而不是矩形,交替元素将被使用的事实。在使用的每个元素中,我们将存储一个简单的整数,表示那里的球的颜色索引,如果空间是空的,则为-1。所以一个小型的运动场看起来像这样:

    col  012345678901234567
row 0    2.3.-.5.3.-.3.-.-.
row 1    .2.1.4.-.3.2.5.-.-
row 2    4.1.2.3.2.6.-.-.-.
row 3    .2.1.3.4.4.-.-.-.-
row 4    -.-.-.-.-.-.-.-.-.

其中.是未使用的元素(我们从未检查过的值),-是值为-1的元素,表示空的十六进制单元格。

请注意,对于行r,列c的任何十六进制单元格,其邻居位于

    [r-1, c-1]    [r-1, c+1]
[r, c-2]                [r, c+2]
    [r+1, c-1]    [r+1, c+1]

充分考虑了比赛场地的边缘。

现在假设我们已经确定刚刚射出的颜色为3的球已落在第4行第6列。检查其邻居,我们看到西北邻居颜色为3,并检查其< / em>邻居我们看到它的东北邻居也是颜色3,所以我们有一个三个相同的链,我们可以删除它们。

您可以递归地执行此检查,或者在颜色和“相同颜色邻居”计数的每个十六进制单元格内跟踪。我怀疑,不能说我的头脑哪个会更好 - 递归。

我们仍然可以确定如何确定射击球的落地位置;但我们现在可以很容易地看到,我们只是简单地使计算轨迹的代码也确定哪个十六进制单元依次被计为“进入”,并且一旦这样的十六进制单元具有非空邻居就立即停止,假设你想让球贴在第一个已经落地的球上,它就会靠近它。

仍然需要考虑的事情:

  • 当玩家进行连锁而我们删除球时,其他球是否会崩溃?或者没有更长时间连接的球落下?我们如何确定落地球是否与屋顶连接?
  • 这种天真的碰撞检测是否足够好? (我怀疑它不是 - 因为如果一个发射的球在一个小区的西南方向放置了一个像素,并且有一个东北邻居,它将跳过并坚持下去)。

希望这会给你一些想法。

答案 1 :(得分:1)

从我的头脑中继续我的伪造的c#实现 - 我希望自我解释。

Class Bubble
{
  Color bubbleColor;
  Bubble[] adjacentMatchedBubbles;
  Bubble[][] board;
  int posX, posY;

  destroyMatchedNeighbours()
  {
    foreach(Bubble i in adjacentMatchedBubbles)
    {
      i.destroyMatchedNeighbours();
    }
    destroySelf();
  }

  positionOnBoard(int x, int y)
  {
     animateTo(x,y);
     discoverMatchedNeighbours();
     if(adjacentMatchedBubbles.length > 2)
     {
       destroyMatchedNeighbours();
     }
  }

  discoverMatchedNeighbours()
  {
     // look in the board 2d array in the elements adjacent to posX and posY
     // if this.bubbleColor = other.bubbleColor add to the adjacentMatchedBubbles array
  }
}

答案 2 :(得分:0)

我会使用二维数组存储当前的游戏状态,然后当气泡停止时检查相邻的气泡是否有颜色,如果它们匹配则检查相邻的颜色,直到不再有相同颜色的相邻气泡。

您必须记住,当您检查相邻气泡时,每隔一行会略微偏移。