libGDX: Hanging rope knotted with some pivot

前端 未结 1 787
时光取名叫无心
时光取名叫无心 2021-01-23 08:04

I am trying to make a hanging rope having some object at it lower end in libGDX, Rope should be like hanging rope in Box2D

I have done a lot of research, libGDX has its

1条回答
  •  盖世英雄少女心
    2021-01-23 09:01

    I've started with the answer to a similar question libGDX: Hanging Rope

    and added some code to it to add some missing code and fix some problem in anchor, I think the following code is a suitable to the target proble:

        BodyDef ropeStartDef = new BodyDef();
        int EACH_RING_DISTANCE = 10
        ropeStartDef.type = BodyType.StaticBody;
        ropeStartDef.position.set(m_camera.viewportWidth/2,m_camera.viewportHeight );
        Body ropStartBody = m_world.createBody(ropeStartDef);
        PolygonShape ropeStartShape = new PolygonShape();
        ropeStartShape.setAsBox(5, 5);
        ropStartBody.createFixture(ropeStartShape, 0);
        ropeStartShape.dispose();
        //----------------------------
        RevoluteJointDef jd = new RevoluteJointDef();
        Body prevBody = ropStartBody;
        int angle = -90;
        Vector2 position = ropeStartDef.position;
        BodyDef previousbodyDefinition= ropeStartDef;
        for(int i=0; i<5; i++)
            {
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DynamicBody;
                bd.angle = angle-MathUtils.PI/2;
                bd.position.set(position.x + i*MathUtils.cos(angle)*EACH_RING_DISTANCE, 
                                position.y + i*MathUtils.sin(angle)*EACH_RING_DISTANCE);
                Body body = m_world.createBody(bd);
                FixtureDef eachRingFD;
                eachRingFD = new FixtureDef();
                CircleShape chainCircleshape =new CircleShape();
                chainCircleshape.setRadius(4);
                eachRingFD.density = 2;
                eachRingFD.shape =chainCircleshape;
                body.createFixture(eachRingFD);
    
                Vector2 anchor = new Vector2(bd.position.x - MathUtils.cos(angle)*EACH_RING_DISTANCE/2f, 
                                             bd.position.y - MathUtils.sin(angle)*EACH_RING_DISTANCE/2f);
                jd.initialize(prevBody, body, anchor);
                //-----------------------added based on http://www.emanueleferonato.com/2009/10/05/basic-box2d-rope/
                    RevoluteJointDef joint = new RevoluteJointDef();
                    joint.initialize(prevBody, body, anchor);
                    m_world.createJoint(joint);
    
                //------------------------end of added
                prevBody = body;
                previousbodyDefinition = bd;
            }
    

    0 讨论(0)
提交回复
热议问题