繁体   English   中英

LibGDX-Box2D:使用2个手指的MouseJoint

[英]LibGDX - Box2D: using MouseJoint for 2 fingers

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

在此处输入图片说明

我有基本的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;
    }
}
}

如何使用两根手指修改此类?

您可以做的是创建一个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;
    }
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM