LibGDX - Box2D:使用MouseJoint 2个手指

时间:2013-07-03 10:35:41

标签: android box2d libgdx game-physics

我想用两根手指控制盒子,如下所示:

enter image description here

我有基本MouseJoint implementation

public class MyMouseJoint{

OrthographicCamera cam; 
World world;

Body groundBody ;   
public MouseJoint mouseJoint = null;    
Body hitBody = null;    
Vector2 target = new Vector2(); 
Vector3 testPoint = new Vector3();

QueryCallback callback = new QueryCallback() {
    @Override
    public boolean reportFixture (Fixture fixture) {
        // if the hit fixture's body is the ground body we ignore it            
        if (fixture.getBody() == groundBody) return true;

        // if the hit point is inside the fixture of the body
        // we report it
        if (fixture.testPoint(testPoint.x, testPoint.y)) {
            hitBody = fixture.getBody();
            return false;
        } else
            return true;
    }
};

public MyMouseJoint(OrthographicCamera cam, World world, Body groundBody){
    this.cam=cam;
    this.world=world;
    this.groundBody = groundBody;  
}

    //USE THIS FUNCTION IN touchDown
public void createMouseJoint(float x, float y){
    // translate the mouse coordinates to world coordinates
            testPoint.set(x, y, 0);
            cam.unproject(testPoint);

            // ask the world which bodies are within the given
            // bounding box around the mouse pointer
            hitBody = null;
            world.QueryAABB(callback, testPoint.x - 0.1f, testPoint.y - 0.1f, testPoint.x + 0.1f, testPoint.y + 0.1f);

            if (hitBody != null) {
                MouseJointDef def = new MouseJointDef();
                def.bodyA = groundBody;
                def.bodyB = hitBody;
                def.collideConnected = true;
                def.target.set(testPoint.x, testPoint.y);
                def.maxForce = 10000.0f * hitBody.getMass();
                def.frequencyHz=100;
                def.dampingRatio=0;

                mouseJoint = (MouseJoint)world.createJoint(def);
                hitBody.setAwake(true);
            }

}

    //USE THIS FUNCTION IN touchDragged
public void dragMouseJoint(float x, float y){
    if (mouseJoint != null) {
        cam.unproject(testPoint.set(x, y, 0));
        mouseJoint.setTarget(target.set(testPoint.x, testPoint.y));
    }
}

    //USE THIS FUNCTION IN touchUp
public void releaseMouseJoint(){
    if (mouseJoint != null) {
        world.destroyJoint(mouseJoint);
        mouseJoint = null;
    }
}
}

如何修改此类以使用2个手指?

1 个答案:

答案 0 :(得分:0)

你可以做的是创建一个Body数组并使用触摸指针初始化hitbody []。您可以将上面的代码更改为以下代码。

在以下函数中,如果当前触摸,可变量指针是指针

public class MyMouseJoint{

OrthographicCamera cam; 
World world;

Body groundBody ;   
public MouseJoint mouseJoint[] = new MouseJoint[2];    
Body hitBody[] = new Body[2];    
Vector2 target = new Vector2(); 
Vector3 testPoint = new Vector3();

Body tempBody;

QueryCallback callback = new QueryCallback() {
    @Override
    public boolean reportFixture (Fixture fixture) {
        // if the hit fixture's body is the ground body we ignore it            
        if (fixture.getBody() == groundBody) return true;

        // if the hit point is inside the fixture of the body
        // we report it
        if (fixture.testPoint(testPoint.x, testPoint.y)) {
            tempBody = fixture.getBody();
            return false;
        } else
            return true;
    }
};
public MyMouseJoint(OrthographicCamera cam, World world, Body groundBody){
    this.cam=cam;
    this.world=world;
    this.groundBody = groundBody;  
}

    //USE THIS FUNCTION IN touchDown
public void createMouseJoint(float x, float y,int pointer){
    // translate the mouse coordinates to world coordinates
            testPoint.set(x, y, 0);
            cam.unproject(testPoint);

            // ask the world which bodies are within the given
            // bounding box around the mouse pointer
            hitBody[pointer] = null;

            world.QueryAABB(callback, testPoint.x - 0.1f, testPoint.y - 0.1f, testPoint.x + 0.1f, testPoint.y + 0.1f);
            hitBody[pointer] = tempBody;

            if (hitBody[pointer] != null) {
                MouseJointDef def = new MouseJointDef();
                def.bodyA = groundBody;
                def.bodyB = hitBody[pointer];
                def.collideConnected = true;
                def.target.set(testPoint.x, testPoint.y);
                def.maxForce = 10000.0f * hitBody[pointer].getMass();
                def.frequencyHz=100;
                def.dampingRatio=0;

                mouseJoint[pointer] = (MouseJoint)world.createJoint(def);
                hitBody[pointer].setAwake(true);
            }

}

    //USE THIS FUNCTION IN touchDragged
public void dragMouseJoint(float x, float y,int pointer){
    if (mouseJoint[pointer] != null) {
        cam.unproject(testPoint.set(x, y, 0));
        mouseJoint[pointer].setTarget(target.set(testPoint.x, testPoint.y));
    }
}

    //USE THIS FUNCTION IN touchUp
public void releaseMouseJoint(int pointer){
    if (mouseJoint[pointer] != null) {
        world.destroyJoint(mouseJoint[pointer]);
        mouseJoint[pointer] = null;
    }
}
}