Box2D基于网格的碰撞

4

首先,让我简要介绍一下我的想法。我正在使用Box2D制作类似俄罗斯方块的游戏。虽然在这种情况下Box2D可能并不是最佳选择,但我确实需要正常的物理效果,因为关卡中有障碍物,如果你撞到它们,方块就应该旋转。

这里有一张图片来演示我的意思。

enter image description here

情况1: 这就是我想要的样子。

情况2: 这是我的一个想法,只是把下落方块的大小稍微缩小一点,使它们更好地适应空白区域。不出所料的问题是方块周围的空白区域。看起来像是盒子不属于那里。

情况3: 将下落方块的大小保持与“墙”块的大小相同,它永远无法到达空白区域,因为边缘会碰撞并停留在那里。

那么我该如何使它适合填充空白区域而又不显得奇怪呢?

编辑:如果我让下落物体的大小变小,它在这种情况下就行不通了:enter image description here

这里有一张图片来演示我想要的行为:

enter image description here


我认为在你接近拼合位置之前,可以使用普通的Box2d物理引擎,然后禁用物理引擎并编写自己的逻辑来补偿,只要方块足够“接近”,就可以使其拼合。此外,http://gamedev.stackexchange.com/可能是这样一个问题更好的资源。 - Kevin DiTraglia
1
我建议不要使用物理引擎来处理这个问题。它存在很多问题,最终你会像 http://xkcd.com/724/ 中描述的那样。如果块可以任意旋转,那么如何检测何时填充一条线呢? - Thomas
我不需要检查行是否被填满。玩家通过能够放置在关卡中的方块数量获得奖励。 - Rohit Malish
我同意不使用物理引擎(尽管我非常喜欢使用它们)。大约5年前,我看到有人用C#实现了这个游戏(http://www.amazon.com/Professional-XNA-Programming-Building-Windows/dp/0470261285)。你可以不用物理引擎来实现它。 - FuzzyBunnySlippers
如果得分是根据玩家可以放置多少个方块来计算的话,那么似乎你根本不需要瓷砖,而你第一张图片中的中间示例(2)应该可以。但我想你可以检测块停止后哪些瓷砖方块被填充,并用全尺寸的方块替换它们。 - iforce2d
但我只在关卡结束时检查它,因此我需要下一个方块与前面的方块很好地配合。 - Rohit Malish
1个回答

3

1)在你的物体上使用setFixedRotation(true)。
2)将其缩小到比可用空间小一点(两侧都要)。差异应该很小,以至于效果看不见(但对于box2d来说足够了)。

这应该可以解决你的问题。
边缘不会碰触,但如果必要,你也可以尝试去除摩擦力。

注意:
在你的情况下使用物理引擎可能有些过度,但只要使用得当,这并不是一个坏主意。祝好运。

更新:
1)不要使物体变小。让它们变薄。 :)
Small vs Thin 这应该可以解决你的第一个问题。

2)如果你想要下面展示的行为,即在下落时自由旋转+接触地面时正确定向。这两个事情本质上是互相矛盾的。

我建议重新考虑你的策略。但如果你决心以同样的方式做,那么有一些奇怪的方法可以实现它(毕竟没有什么是不可能的,对吧?)。
我现在能想到的一个方法是实现所有物体始终倾向于以最接近正确方向的方式旋转(将当前方向作为外部力矩的函数)。它应该在渲染时更新。这实际上是一个控制系统,但不能保证在碰撞时就能实现正确的定向,而且物理表现也不自然。只要尽情发挥你的想象力,玩得开心即可。如果你找到更好的方法,我肯定会很乐意看到它。

祝玩得愉快。


但是,如果我把它变小一点点,即使只有0.0000001%,在形状为“U”形且必须适合中间其他块的情况下,它也无法工作。我编辑了我的问题并添加了解释图像。 - Rohit Malish
我还没有实现它,但我认为你说得对,这可能是正确(或唯一)的方法。 - Rohit Malish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接