我在libgdx中使用了Tiled地图,现在我正在尝试与这些地图进行冲突。我认为在Tiled中绘制多边形并将它们用于libgdx中的碰撞真的很有用。我实际上更喜欢这种方式,而不是每次瓦片碰撞,因为它会给我游戏所需的碰撞灵活性。
我已经成功解析了每个对象的xml并抓住了多边形点。我已经能够用这些制作一个box2d PolygonShape并且它会出现在游戏中!但它反映了颠倒......
我认为平铺必须位于与libgdx不同的坐标系上,所以我只创建了一个找到最大y点的函数,并以正确的y翻转方式从中减去y点的其余部分。但现在我收到了这个错误:
java: /var/lib/hudson/jobs/libgdx-git/workspace/gdx/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp:115: b2Vec2 ComputeCentroid(const b2Vec2*, int32): Assertion `area > 1.19209289550781250000e-7F' failed.
它看起来像是libgdx本机方面的错误。 是否有人可以帮我解决这个问题?
这是我的tmx文件中的相关部分。
<objectgroup height="20" name="Object Layer 1" width="20">
<object x="100" y="320">
<polygon points="0,0 244,1 300,50 300,95 -12,88 -29,19"/>
</object>
<object height="104" width="116" x="437" y="175"/>
</objectgroup>
这是代码,它在Scala中,翻转多边形。它需要一个Border对象,它有一个多边形字段,它只是一个Vector2s数组。 _type字段是一个符号,它看起来像是stackoverflow的语法高亮显示。
def flipPolygonY(border: Border){
if(border._type == 'polygon){
//find the highest y point
var max = border.polygon(0).y
for(vect <- border.polygon){
max = max.max(vect.y)
}
//flip it, take max - y
for(vect <- border.polygon){
vect.set(vect.x, max - vect.y)
}
}
}
答案 0 :(得分:0)
好吧我想出来了,做了一些搜索我读到必须按顺时针顺序定义多边形。所以在预感中我颠倒了我的数组或Vector2的顺序。有用。因此,如果其他人想要在libgdx中使用Tiled中的多边形,请在Y轴上翻转它们并反转顺序。