c# - 检测附近相同的物体

标签 c#

所以我偶尔会写一个游戏。只是为了好玩,这样我就能学到新东西。 到目前为止,我已经能够制作出可以运行的“Breakout”和“SpaceInvaders”游戏。所以我知道如何处理碰撞处理等。

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

希望你们了解这个游戏。

我对游戏的某个方面有疑问。 如您所知,如果彩色球击中 2 个或更多相同颜色球相连的地方 - 它们都会“弹出/消失”。

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

我需要知道不同的球是哪个物体的某种提示,以便我可以在撞击时将它们全部删除。

那么是的,我应该怎么做呢?

最佳答案

根据我对此类游戏的经验,作为比赛 field 一部分的气泡(即已经发射并着陆的气泡)并不是任意放置的,而是适合>定义明确的网格。这使得解决的问题不是一个几何问题(这会很繁琐),而是一个遍历数据结构的问题。

我建议你使用一些东西,可能像二维数组一样简单,它代表已经落地的气泡的颜色。一旦确定了新气泡的着陆位置,您就可以检查该数组中的邻居。您需要小心交替行偏移的事实,但这里没有任何问题是清晰的图表无法解决的。

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

编辑好的,这是存储网格的一种方法:

我们将使用一个二维数组,按行和列索引,但为了处理网格实际上是六边形而不是矩形的事实,将不使用替代元素。在使用的每个元素中,我们将存储一个简单的整数,表示那里的球的颜色索引,如果空间空闲,则存储 -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]

适当考虑比赛 field 的边缘。

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

您可以递归地执行此检查,或者在每个十六进制单元格内跟踪颜色以及“相同颜色邻居”计数。我无法立即说出哪一个会更好 - 我怀疑是递归。

还有待说明的是我们如何确定发射的球落地的位置;但我们现在可以很容易地看到,我们只需让计算轨迹的代码也确定球依次算作“进入”的六角形单元,并在其中一个六角形单元具有非空邻居时立即停止,假设您希望球粘在它靠近的第一个已经落地的球上。

仍然需要考虑的事情:

  • 当玩家形成一条链并删除球时,其他球会塌陷吗?或者不再附着的球会掉下来吗?我们如何判断落地的球是否与屋顶相连?
  • 这种简单的碰撞检测足够好吗? (我怀疑它不是 - 因为如果一个发射的球将一个像素放入一个单元格的西南方向,并且有一个东北邻居,它会跳过并粘在它上面)

希望这能给您一些继续下去的想法。

关于c# - 检测附近相同的物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1945560/

相关文章:

c# - 你如何从 C# 中的保存文件对话框中保存?

c# - PLINQ 异常

c# - 使用数据注释限制字典中的键及其值的字符数

c# - 寻找一种更好的方法来初始化 C# 中的大量对象

c# - 如何获取.net core项目中项目文件夹中存在的文件的相对路径

c# - 如何通过脚本统一制作多个网格?

c# - 单击 Enter 时 WPF RichTextBox 放置 2 行而不是 1 行

c# - 如何使用 iTextSharp for C# 设置现有 PDF 的版权元数据

c# - 为什么需要业务逻辑层?

c# - .NET 中是否有自动排序的列表?