4

我正在按照教程(这是我的第一个游戏)用 Java编写炸弹人。本教程建议使用以下代码来检测碰撞。

        for (int p=0; p<entities.size(); p++) {
            for (int s=p+1; s<entities.size(); s++) {
                Entity me = (Entity) entities.get(p);
                Entity him = (Entity) entities.get(s);

                if (me.collidesWith(him)) {
                    me.collidedWith(him);
                    him.collidedWith(me);
                }
            }

到目前为止,entities是一个包含敌人和玩家的数组列表。由于我还想检测玩家与墙壁的碰撞,我是否应该将关卡中的每一面墙或砖块放入实体数组列表中?如果是这样,这个算法是不是非常低效?这些图块不会与其他图块发生冲突,因此我正在考虑管理不同列表中的游戏实体。你有什么建议?有没有更有效的算法来做到这一点?

注意:我已经阅读了与 2D 游戏中的碰撞相关的其他问题。非常感谢。

4

3 回答 3

10

我建议阅读这篇关于幽灵移动和碰撞检测如何在PacMan中工作的优秀文章。

然后我建议在逻辑上将您的炸弹人关卡建模为一组图块。每个图块代表您关卡中的一个离散位置,从逻辑上讲,不可能永远处于“之间”图块或同时占据两个图块。每个图块都可以跟踪当前在其上的地形特征,以及它是否是玩家(以及敌人)的有效目的地图块,如果允许敌人穿越通常无法通过的地形,则每个图块可能具有不同的规则为玩家)。

那么你就不需要为世界上的每个物体都使用碰撞检测算法了。当敌人需要移动时,或者当用户试图移动他们的角色时,您所要做的就是检查与其当前图块相邻的所有图块(如果允许对角线移动,最多 4 个或 8 个),查看每个图块是否代表一个有效的移动方向,如果它不是一个有效的方向,则阻止移动。

为了回答你的问题,是的,在每次位置更新时迭代世界上的每个对象都是非常低效的。

于 2011-07-25T04:38:53.980 回答
2

还有另一种将网格用于碰撞系统的方法。我正在使用 Aroth 建议的更复杂版本,并使用它来修复碰撞错误。

理论上这个系统是最快的(假设你正在做这个检查if(Grid[x][y] ==true)),因为它只对每个实体(可以移动的东西)使用一个布尔检查。

注意:在上面的网格检查示例中,我使用了一个二维布尔数组,它将不可通过的网格的坐标设置为 false。`

如果您不担心从墙上弹起等物理现象,您可以使用以下方法:

1- Divide the map into grids. 
2- Making every entity only fill a tile would be better but not necessary. 
3- Store the previous position or the grid of the entities.
4- Whenever an entity moves, before visually updating their location (also before 
doing other calculations) check the grids they are in. If they are in grid 
that is not empty or simply in a grid that they are not supposed to 
be, return their position back to the previous position (which you have stored). 

如果您想允许实体在网格内自由移动(网格大于它们可以移动的最小距离),那么您需要将它们放置在它们输入的网格附近,而它们不应该这样做。否则,只需将它们返回到以前的网格。

如果你想让它们从墙上反弹,你仍然可以使用它,但我不确定有多少功能可以添加到这样的碰撞系统中。

于 2014-10-29T08:01:52.560 回答
0

我可以推荐我自己的项目。但它仍然是wip。 https://github.com/YagaoDirac/Dirac-2d-collision-detection-for-games 它基于四叉树,可以很好地处理稀疏。它提供碰撞组。这个概念也用于 UE 和 Unity。它目前仅支持圆形与圆形和重叠(2022 年 2 月 22 日)。

我计划至少制造 AABB,碰撞至少可以阻止你的棋子离开地图。

我还可以提供另一个基于固定网格的系统。

于 2022-02-22T08:19:47.260 回答