嘗試組合瓷磚。舉例來說,如果你有16個區塊,像這樣的16分矩形碰撞體...
* * * *
* * * *
* * * *
* * * *
您可以將這些瓷磚明顯合併成一個大的矩形。
現在,事情變得更加困難,如果你在一個奇怪的安排有瓷磚,也許是這樣的...
**---
****-
*--**
-*-*-
我剛剛使用quad tree和sweep and prune解決了這個問題,在我的遊戲。 (掃描和修剪不是必須的,它是一種優化。)
Quad tree將您的正方形瓷磚劃分爲更大的矩形,然後遍歷四叉樹生成的矩形,如果它們具有相同的寬度,則將它們組合在一起再次迭代它們並將它們組合到相似的高度。重複,直到你不能再組合它們,然後產生你的碰撞體積。
Here's a link to a question我問了一個更優化的減少。我可能不會實現這個,因爲聽起來很難,而且我目前的方法運作良好。
一些代碼:
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);
}
}
多大的tilemap的?我做了1000x1000的瓷磚。 –
只需在Box2D中一次添加它們全部?哇,這很令人印象深刻。我正在使用可憐的100x100。 – helsont
您可以使用形狀類的重疊方法。這不是它所稱的,但我忘記了它的名字。它在javadoc的形狀。 –