我正在制作简单的游戏 - 一种比赛游戏,你从“天空”看到你的精灵与Box2D身体相连,他们必须沿着一些路径移动。我的想法是通过检测它们与覆盖路径的隐形体(设置为传感器)的接触来检测它们是否会走出路径。我的代码看起来像这样:
ArrayList<Vector2> UniqueBodyVertices = new ArrayList<Vector2>();
UniqueBodyVertices.addAll((List<Vector2>) ListUtils.toList(new Vector2[] {
new Vector2(-432, -95),
new Vector2(-326, -22),
new Vector2(-327, 17),
new Vector2(-440, 96),
new Vector2(-444, 238),
new Vector2(-393, 290),
...
new Vector2(-303, -279),
new Vector2(-425, -285)
}));
List<Vector2> UniqueBodyVerticesTriangulated = new EarClippingTriangulator().computeTriangles(UniqueBodyVertices);
float[] meshTriangles = new float[UniqueBodyVerticesTriangulated.size() * 3];
for(int i = 0; i < UniqueBodyVerticesTriangulated.size(); i++){
meshTriangles[i*3] = UniqueBodyVerticesTriangulated.get(i).x;
meshTriangles[i*3+1] = UniqueBodyVerticesTriangulated.get(i).y;
UniqueBodyVerticesTriangulated.get(i).mul(1/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT);
}
Sprite bg = new Sprite(0, 0, 1024, 768, ResourceManager.getInstance().mBackGroundRegion, getVertexBufferObjectManager());
Mesh mesh = new Mesh(0, 0, meshTriangles, UniqueBodyVerticesTriangulated.size(), DrawMode.LINE_STRIP , getVertexBufferObjectManager());
mesh.setColor(Color.RED);
Body meshBody = PhysicsFactory.createTrianglulatedBody(physicsWorld, mesh, UniqueBodyVerticesTriangulated, BodyType.StaticBody, PhysicsFactory.createFixtureDef(0f, 0f, 0f, true));
physicsWorld.registerPhysicsConnector(new PhysicsConnector(mesh, meshBody, true, true));
meshBody.setUserData("trasa");
我删除了一些顶点只是为了缩短这里的代码。我也知道应该有BodyType.Triangles
而不是BodyType.LineStrip
- 它只是用于检查身体行为并且不会改变任何东西。无论如何我在这里粘贴的东西都有效,我的路径被我想要的身体覆盖,但问题在于检测到接触。我有ContactListener
的另一部分代码:
@Override
public void endContact(Contact contact) {
final Fixture x1 = contact.getFixtureA();
final Fixture x2 = contact.getFixtureB();
if(x2.getBody().getUserData().equals("kapselBialy")&&x1.getBody().getUserData().equals("trasa"))
{
mScene.setBackground(new Background(Color.RED));
}
if(x2.getBody().getUserData().equals("trasa")&&x1.getBody().getUserData().equals("kapselBialy"))
{
mScene.setBackground(new Background(Color.RED));
}
}
问题是我体内有很多三角形,其中一些是我路径体的一部分,有些与否。从外面看,整条道路被视为一体。但是当我的球员身体在它上面盘旋(完全接触)时,它有时会被检测为接触,有时不会。看起来有些三角形被视为一个体,有些则不是。问题是如何使它成为一个没有洞的一个整体?
修改
我附上了项目中的图像。正如你所看到的那样,三角剖分产生了三角形。我的精灵检测到其中一些是路径的主体,有些则没有(我通过endContact()
检查)。那么我该怎么做才能让所有的三角形都像一个身体一样呢?只是添加:如果我使路径主体不是传感器,并尝试从外部反弹我的精灵,它起作用:路径主体在整个长度上从外部是固体,但不在路径主体内部。希望现在更清楚了。
答案 0 :(得分:0)
解决了!好的,所以检查我们的球员身体是否离开我们的路径的主体的想法是计算边界球员身体的传球。所以在contactlistener中我们使beginContact将一个添加到某个int变量(比如borderPassed)和endContact从中减去一个。所以当我们的玩家在路径中时,这个变量总是大于0.当它离开路径时它将是0.这就是我们检查的内容。