Box2d复制一个正文(libgdx)

时间:2015-09-17 01:34:36

标签: java libgdx box2d

我想在我的box2d世界中复制一个身体(包括固定装置,连接它的关节)。

我没有尝试任何东西,因为我没有看到任何方法可以做到这一点。

所以我的问题是:是否有可能复制一个身体?如果是的话,该如何做到这一点。

2 个答案:

答案 0 :(得分:2)

我建议创建一个方法来创建一组实体,并将基本组的速度等应用于它们。

    Body createGroup()
    {
        //creating bodies, joints etc
        //returning the root body for joint group
    }

如果你想逐个复制实体,不幸的是没有简单的方法来实现它。虽然我认为可以实现它。

要创建正文副本,通常需要:

  • BodyDef和FixtureDef对象 - 无法从正文中获取bodyDef,但您可以轻松地在创建body时将其写入UserData对象,然后只需获取UserData

    BodyDef bodyDef = new BodyDef();
    FixtureDef fixtureDef = new FixtureDef();
    
    //setting up body and fixture definitions
    
    body = world.createBody(bodyDef);
    
    body.createFixture(fixtureDef).setUserData( fixtureDef );
    body.setUserData( bodyDef );
    
    ...
    
    //then just somewhere in your app
    BodyDef copyBodyDef = (BodyDef) body.getUserData();
    FixtureDef copyFixtureDef = (FixtureDef) body.getFixtureList().first().getUserData();
    

    当你通过迭代夹具列表将多个夹具连接到主体时,你也应该处理这种情况

  • 位置,力度,阻尼等 - 您可以在应用生活中设置身体某些特征,也可以使用

    等功能检索它们
    Vector2 getLinearVelocity();
    Vector2 getPosition()
    ...
    

    您可以在official box2d manual中阅读有关正文的信息,但在我看来,更好的参考资料是the LibGDX one

  • 关节 - 这是我认为最大的问题。您可以使用以下方法迭代关节:

    for(JointEdge edge : body.getJointList())
    {
        Joint joint = edge.joint; //joint has getUserData() so you can again remember joint definition
        Body jointBody = edge.other;
    }
    

    但是复制完全相同的配置似乎并不容易,因为你必须检查你已经创建了哪些关节副本(如果你在身体关节上进行迭代,你也应该迭代它们的neibghbour等等)。 ..)

答案 1 :(得分:0)

您可以按照Utils library(LibGDX论坛)中的建议使用Dermetfan中的this post。它包含一些非常方便的box2dUtils。像Body clonedBody = clone(body,true);这样的东西可以满足您的需求。