所以我偶尔会写一个游戏。只是为了好玩,这样我就能学到新东西。 到目前为止,我已经能够制作出可以运行的“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/