0

我有在 libgdx 中工作的平铺地图,现在我正试图与这些地图发生碰撞。我认为在 Tiled 中绘制多边形并将它们用于 libgdx 中的碰撞会非常有用。实际上,我更喜欢这种方式,而不是进行每个瓷砖碰撞,因为它会给我游戏所需的碰撞灵活性。

我已经成功解析了每个对象的 xml 并抓取了多边形点。我已经能够用这些制作一个 box2d PolygonShape,它会出现在游戏中!但它是颠倒的镜像...

我认为 tiled 必须位于与 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)
        }
    }
}
4

1 回答 1

0

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

于 2013-02-01T02:43:06.797 回答