如何在 andEngine/Android 中使用 PhysicsFactory.createTriangulatedBody() 和 EarClippingTriangulator 制作完整的 body

How to make full body with PhysicsFactory.createTriangulatedBody() and EarClippingTriangulator in andEngine/Android

我正在制作简单的游戏 - 一种竞赛游戏,您可以从 "sky" 中看到您的精灵附有 Box2D 物体,它们必须沿着某条路径移动。我的想法是通过检测他们与覆盖路径的不可见 body(设置为传感器)的接触来检测他们是否会离开路径。我的代码看起来像这样:

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 - 它只是为了检查身体的行为并且不会改变任何东西。无论如何,我在这里粘贴的内容有效,并且我的路径像我想要的那样被 body 覆盖,但问题是检测接触。我还有 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));

            }

        }

问题是在我的 body 里面有很多三角形,其中一些是我的路径 body 的一部分,有些则不是。从外部看,整个路径被视为一个 body。但是当我的玩家 body 悬停在它上面(完全接触)时,有时会检测到它处于接触状态,有时则不会。看起来有些三角形被视为 body 而有些则不是。问题是如何使整个路径被视为一个 body 没有漏洞?

编辑 我附上来自 project.As 的图像,您可以看到三角剖分创建了三角形。我的 sprite 将其中一些检测为路径的 body,而另一些则没有(我通过 endContact() 检查)。那么我该怎么做才能将所有三角形都视为一个 body?补充一下:如果我让路径 body 不是传感器,并尝试从外部弹跳我的精灵,它会起作用:路径 body 从整个长度的外部都是实心的,但不是在路径内部 body。希望现在更清楚了。

已解决!好的,所以检查我们的玩家 body 是否离开了我们路径的 body 的想法是计算边界玩家 body 的通行证。因此,在 contactlistener 中,我们让 beginContact 向某个 int 变量(比如说 bordersPassed)加一,然后 endContact 从中减一。因此,当我们的玩家在路径内时,此变量将始终大于 0。当它离开路径时,它将为 0。这就是我们检查的内容。