【发布时间】:2015-10-15 21:24:54
【问题描述】:
短版:
如何从Physics Body Editor 获得基本的com.badlogic.math.gdx.Polygon?
加长版:
我已经为 LibGDX 实现了加载器,但是加载器通过它的内部 RigidBody 类使用它自己的内部 PolygonModel 类。最终我可以从每个单独的多边形中获取每个顶点并从那里构建我自己的多边形。但这似乎不是很“微不足道”。我的想法是这样的:
List<Polygon> myPolygons = new ArrayList<Polygon>();
Map<String, BodyEditorLoader.RigidBodyModel> bodyMap = loader.getInternalModel().rigidBodies;
for (BodyEditorLoader.RigidBodyModel m : bodyMap.values())
{
for (BodyEditorLoader.PolygonModel pm : m.polygons)
{
float[] vertArray = new float[pm.vertices.size() * 2];
int count = 0;
for (Vector2 v2 : pm.vertices)
{
vertArray[count] = v2.x;
vertArray[count + 1] = v2.y;
count += 2;
}
myPolygons.add(new Polygon(vertArray));
}
}
这相当麻烦,我有这个完整的加载器只是为了剥离它构建的所有内容直到索引并从中构建我自己的多边形。然而,editor 确实为我提供了一个 json,但不幸的是它是一行,因此 json 的好处被浪费了。如果我可以手动修复布局并破译需要解析的内容,但我想知道我是不是在这里重新发明轮子。
除此之外,可能只有一个非常简单的解决方案来获取我的多边形。
我需要它来做什么?
好吧,我正在为我的精灵寻找一些精确的碰撞检测。矩形和圆形无法胜任。多边形非常适合这一点,它们有一个用于廉价检测的矩形,Intersector 可以处理两个多边形的碰撞。我能想到以某种有效的方式创建这些多边形的唯一方法是使用我链接到的editor。
如果有人有更好的建议,我会全力以赴。
这就是我当前的 Json 输出的样子。它对我来说有多余的节点,但只有一行没有空格和行尾,解密是一种痛苦。
{"rigidBodies":[{"name":"terrain","imagePath":"groundGrass.png","origin":{"x":6.250441074371338E-4,"y":-6.705522537231445E-8},"polygons":[[{"x":0.375,"y":0.05569307133555412},{"x":0.3087501525878906,"y":0.0837499126791954},{"x":0.19375014305114746,"y":0.07812491804361343},{"x":0.16212871670722961,"y":0.0445544607937336}],[{"x":0.16212871670722961,"y":0.0445544607937336},{"x":0.5792078971862793,"y":0.034653469920158386},{"x":0.426980197429657,"y":0.05445544794201851},{"x":0.375,"y":0.05569307133555412}],[{"x":0.5792078971862793,"y":0.034653469920158386},{"x":0.5406249761581421,"y":0.07374989986419678},{"x":0.46039605140686035,"y":0.0717821791768074},{"x":0.426980197429657,"y":0.05445544794201851}],[{"x":0.05198019742965698,"y":0.035891093313694},{"x":0.0445544570684433,"y":0.04207921028137207},{"x":0.007425742689520121,"y":0.043316833674907684},{"x":0,"y":0.037128716707229614}],[{"x":0,"y":0.037128716707229614},{"x":8.940696716308594E-8,"y":6.249025464057922E-4},{"x":0.10891088843345642,"y":0.03217822313308716},{"x":0.05198019742965698,"y":0.035891093313694}],[{"x":8.940696716308594E-8,"y":6.249025464057922E-4},{"x":0.6596534848213196,"y":0.01980198174715042},{"x":0.6274752616882324,"y":0.03341584652662277},{"x":0.5792078971862793,"y":0.034653469920158386},{"x":0.16212871670722961,"y":0.0445544607937336},{"x":0.10891088843345642,"y":0.03217822313308716}],[{"x":8.940696716308594E-8,"y":6.249025464057922E-4},{"x":0.9987500905990601,"y":-6.250739097595215E-4},{"x":0.7093750238418579,"y":0.01874990016222},{"x":0.6596534848213196,"y":0.01980198174715042}],[{"x":0.9987500905990601,"y":-6.250739097595215E-4},{"x":0.9987500905990601,"y":0.04374990612268448},{"x":0.9418317079544067,"y":0.05816832184791565},{"x":0.7846534848213196,"y":0.05816832184791565},{"x":0.7400990128517151,"y":0.053217824548482895},{"x":0.7093750238418579,"y":0.01874990016222}],[{"x":0.9418317079544067,"y":0.05816832184791565},{"x":0.9212501049041748,"y":0.08749989420175552},{"x":0.8131188154220581,"y":0.08292079716920853},{"x":0.7846534848213196,"y":0.05816832184791565}]],"circles":[],"shapes":[{"type":"POLYGON","vertices":[{"x":0.9212501049041748,"y":0.08749989420175552},{"x":0.9418317079544067,"y":0.05816832184791565},{"x":0.9987500905990601,"y":0.04374990612268448},{"x":0.9987500905990601,"y":-6.250739097595215E-4},{"x":8.940696716308594E-8,"y":6.249025464057922E-4},{"x":0,"y":0.037128716707229614},{"x":0.007425742689520121,"y":0.043316833674907684},{"x":0.0445544570684433,"y":0.04207921028137207},{"x":0.05198019742965698,"y":0.035891093313694},{"x":0.10891088843345642,"y":0.03217822313308716},{"x":0.16212871670722961,"y":0.0445544607937336},{"x":0.19375014305114746,"y":0.07812491804361343},{"x":0.3087501525878906,"y":0.0837499126791954},{"x":0.375,"y":0.05569307133555412},{"x":0.426980197429657,"y":0.05445544794201851},{"x":0.46039605140686035,"y":0.0717821791768074},{"x":0.5406249761581421,"y":0.07374989986419678},{"x":0.5792078971862793,"y":0.034653469920158386},{"x":0.6274752616882324,"y":0.03341584652662277},{"x":0.6596534848213196,"y":0.01980198174715042},{"x":0.7093750238418579,"y":0.01874990016222},{"x":0.7400990128517151,"y":0.053217824548482895},{"x":0.7846534848213196,"y":0.05816832184791565},{"x":0.8131188154220581,"y":0.08292079716920853}]}]}],"dynamicObjects":[]}
【问题讨论】:
-
stackoverflow.com/questions/32808014/… 看看我的回答,我发布了我制作的正文编辑器加载器。 JSON 通常用简单的一行表示,它被实用地破译或用一些 JSON 漂亮的打印机输出。
-
@JohnathonHavens 我会调查的。但是我得到的编辑器的 JSON 输出由一个巨大的单行组成,没有空格或行尾。 Json 应该是可读的。而在目前的状态下,它不是。
-
没有 JSON 可以并且经常在一行中输出。 JSON 解析器已完成。除了键值对中的值外,空格没有任何作用。 jsonprettyprint.com 可用于人类可读性。
-
@JohnathonHavens 是的,我添加了自己的答案,将单行转换为可读的内容。我现在都不工作了。我可以使用物理体编辑器,从中生成原始的
gdx.math.Polygon并对其进行碰撞检测。有时间我会写一篇关于这个的教程。我遇到了许多要求这个问题的主题,唯一的答案是实际使用 Box2D,它在没有速度、质量等的情况下无法正常工作,而且对于没有物理的 2D 碰撞来说几乎是多余的。 -
酷,你用过我的代码吗?我只是好奇它是否有任何问题,因为我们都在这里学习。
标签: java libgdx collision-detection polygons