在libgdx中翻转多边形

时间:2013-01-26 21:34:39

标签: java scala geometry libgdx

我在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)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好吧我想出来了,做了一些搜索我读到必须按顺时针顺序定义多边形。所以在预感中我颠倒了我的数组或Vector2的顺序。有用。因此,如果其他人想要在libgdx中使用Tiled中的多边形,请在Y轴上翻转它们并反转顺序。