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