繁体   English   中英

Box2D中的碰撞检测

[英]Collision Detection in Box2D

所以我在游戏中使用Box2D进行碰撞检测。 我有一个图块地图,其中包含有关地形的信息:目前,这只是一个具有道路或草地的char [] []。 现在,在每个级别的开始,我想创建一个矩形来描述不同的地形,但是我希望这些矩形得到优化,并且显然需要相当多的算法。

我的第一种方法是在关卡开始时为地图中的每个图块创建一个单独的地形。 FPS降至5。

我的第二个想法是在玩家沿着地图移动时,简单地为地形创建不同的矩形,删除看不见的矩形。 尽管仍然会有很多矩形,但是会少得多。

我还没有尝试过第二种方法,但是我想知道:对我来说,有没有一种简单的方法可以有效地对具有大图块贴图的地形进行碰撞检测?

谢谢。

尝试结合瓷砖。 例如,如果您有16个图块的16个矩形碰撞体积,例如...

* * * *
* * * *
* * * *
* * * *

您显然可以将这些图块组合成一个大矩形。

现在,如果您将瓷砖排列成奇怪的形状,事情就会变得更加困难,也许像这样……

**---
****-
*--**
-*-*-

我最近刚刚在游戏中使用四叉树清扫和修剪功能解决了这个问题。 (严格修剪和修剪不是必需的,这是一种优化。)

四叉树将方形图块划分为更大的矩形,然后遍历四叉树生成的矩形,如果宽度相同,则将其合并,然后再次遍历它们,并以相似的高度合并。 重复直到无法再合并它们,然后生成碰撞体积。

这是我提出的有关最佳还原的问题的链接 听起来很困难,我可能不会实现,而我目前的方法运行良好。

一些代码:

do {
    lastCompressSize = currentOutput;
    this.runHorizontalCompression(this.output1, this.output2);
    this.output1.clear();
    this.runVerticalCompression(this.output2, this.output1);
    this.output2.clear();
    currentOutput = this.output1.size;
    iterations += 1;
}while (lastCompressSize > currentOutput);

public void runHorizontalCompression(Array<SimpleRect> input,
        Array<SimpleRect> output) {
    input.sort(this.xAxisSort);
    int x2 = -1;
    final SimpleRect newRect = this.rectCache.retreive();
    for (int i = 0; i < input.size; i++) {
        SimpleRect r1 = input.get(i);
        newRect.set(r1);
        x2 = newRect.x + newRect.width;
        for (int j = i + 1; j < input.size; j++) {
            SimpleRect r2 = input.get(j);
            if (x2 == r2.x && r2.y == newRect.y
                    && r2.height == newRect.height) {
                newRect.width += r2.width;
                x2 = newRect.x + newRect.width;
                input.removeIndex(j);
                j -= 1;
            } else if (x2 < r2.x)
                break;
        }
        SimpleRect temp = this.rectCache.retreive().set(newRect);
        output.add(temp);
    }
}

public void runVerticalCompression(Array<SimpleRect> input,
        Array<SimpleRect> output) {
    input.sort(this.yAxisSort);
    int y2 = -1;
    final SimpleRect newRect = this.rectCache.retreive();
    for (int i = 0; i < input.size; i++) {
        SimpleRect r1 = input.get(i);
        newRect.set(r1);
        y2 = newRect.y + newRect.height;
        for (int j = i + 1; j < input.size; j++) {
            SimpleRect r2 = input.get(j);
            if (y2 == r2.y && r2.x == newRect.x
                    && r2.width == newRect.width) {
                newRect.height += r2.height;
                y2 = newRect.y + newRect.height;
                input.removeIndex(j);
                j -= 1;
            } else if (y2 < r2.y)
                break;
        }
        SimpleRect temp = this.rectCache.retreive().set(newRect);
        output.add(temp);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM