使用libgdx中的触摸功能使身体移动

时间:2015-02-27 11:01:11

标签: java android libgdx touch

我是libgdx的新手。我正在努力使用触摸来移动身体,一旦触摸释放它就必须停止前进!它与KeyUp和Key工作正常,但我不知道如何使用touch实现。

这是我的代码。我把它写成一个单独的类。这是班级:

public Player(World world, float x, float y, float width) {
    this.width = width; //IMP
    height = width * 2;
    BodyDef polygon = new BodyDef();
    polygon.type = BodyType.DynamicBody;
    polygon.position.set(x, y); //
    polygon.fixedRotation = true;
    //polygon shape

    PolygonShape poly = new PolygonShape();
    poly.setAsBox(width / 2, height / 2); //

    //fixture defn

    FixtureDef polyfixture = new FixtureDef();
    polyfixture.shape = poly;
    polyfixture.friction = 0.8f;  //
    polyfixture.restitution = 0.1f; //
    polyfixture.density = 1; //


    //creating actual body
    polybody = world.createBody(polygon);
    polybody.createFixture(polyfixture);
    // polybody.applyAngularImpulse(52, true);
    //disposing the body

    polysprite = new Sprite(new Texture("img/car.jpg"));

    polysprite.setSize(0.5f, 1); //size of mario
    polysprite.setOrigin(polysprite.getWidth() / 2, polysprite.getHeight() / 2);
    polybody.setUserData(polysprite);

    poly.dispose();

}


public void update() {
    polybody.applyForceToCenter(velocity, true);
}

@Override
public boolean keyDown(int keycode) {
    // TODO Auto-generated method stub
    switch (keycode) {
        case Keys.D:
            velocity.x = momentForce;
            //leftAxis.enableMotor(true);
            //leftAxis.setMotorSpeed(-motorspeed);
            //movement.x=speed;
            //System.out.println("key d");

            break;

        case Keys.A:
            velocity.x = -momentForce;
            //leftAxis.enableMotor(true);
            //leftAxis.setMotorSpeed(motorspeed);
            //movement.x=-speed;
            // break;
            //case Keys.S:

            //leftAxis.enableMotor(false);
            break;

        case Keys.W:
            velocity.y = momentForce;
            break;
        case Keys.S:
            velocity.y = -momentForce;

            break;


        default:
            return false;
    }
    return true;
}

@Override
public boolean keyUp(int keycode) {
    // TODO Auto-generated method stub
    switch (keycode) {
        case Keys.D:
            velocity.x = 0;
            break;
        case Keys.A:
            velocity.x = 0;
            break;
        case Keys.W:
            velocity.y = 0;
            break;
        case Keys.S:
            velocity.y = 0;
            break;
        default:
            return false;


    }
    return true;
}

@Override

public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    // TODO Auto-generated method stub
    if (Gdx.input.isTouched()) {
        //Vector3 touchPos = new Vector3();
        //  touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
        // camera.unproject(touchPos);
        velocity.y = momentForce;
    }
    return true;
}


public Body getBody() {
    {
        return polybody;
    }


}

这是我的代码。我尝试使用触地得分。我试着通过设定一定的速度来移动身体但没有按预期发生。我无法使用触摸使这个身体(多边形)移动。请帮忙。提前致谢

3 个答案:

答案 0 :(得分:0)

我认为它的工作方式是你需要告诉libgdx你正在使用触控。在documentation中,它表示您需要使用Input.setInputProcessor(InputProcessor)。 在我找到here的示例中,他们使用:

Gdx.input.setInputProcessor(this);

他们已经把它放在了类的构造函数中。我认为在你的情况下,在Player构造函数中应该没问题。

此外,如果你想让你的身体停止,你需要告诉它像你用关键箭头一样停止。你需要添加这样的东西:

@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    velocity.y = 0;
    return true;
}

答案 1 :(得分:0)

@Override 
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
// TODO Auto-generated method stub
if(Gdx.input.isTouched()) {
 //Vector3 touchPos = new Vector3();
//  touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
 // camera.unproject(touchPos);
velocity.y=momentForce;
}
return true; 
}

由于你要覆盖它,我想你的类中有这个方法来实现InputProcessor。由于你的keyUp()和keyDown()方法有效,我想你将类设置为InputProccessor。 如果上述情况属实,则可以修复代码。

  @Override 
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
// TODO Auto-generated method stub
 //Vector3 touchPos = new Vector3();
 //  touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
 // camera.unproject(touchPos);
velocity.y=momentForce;
return true; 
}

您所要做的就是删除if语句。 touchDown()方法仅在用户触摸屏幕时调用。如果你在touchDown中检查Gdx.input.isTouched(),你的代码将永远不会传递你的if语句,因为每当用户触摸屏幕时,他/她将被反馈回touchDown。

答案 2 :(得分:0)

我已经解决了这个问题。在我的课上我实现了InputProcessor,并添加了Gdx.input.setInputProcessor(this);在show方法中,为了让身体在触摸屏幕时沿x轴移动,我添加了以下代码

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {

       Vector3 touchPos = new Vector3();
          touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
          camera.unproject(touchPos);
          movement.x =speed;
          Gdx.app.log("Example", "touch done ");

    return true;
}

因此,身体在触摸屏上沿x轴移动。