当前位置: 首页 > 知识库问答 >
问题:

在libgdx中使用触地键移动身体

方绪
2023-03-14

我是libgdx的新手。我正在努力用触碰让身体移动,一旦触碰被释放,它就必须停止移动!!使用KeyUp和KeyDown可以很好地工作,但我不知道如何使用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个答案

哈朗
2023-03-14

我已经解决了这个问题。在我的类中,我实现了输入处理器,并添加了Gdx.input.set输入处理器(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轴移动。

宋建柏
2023-03-14
@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()方法有效,我想您应该将该类设置为InputProcessor。如果上述情况属实,那么这里有一个修复你的代码。

  @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()方法仅在用户触摸屏幕时调用。如果你查一下Gdx。输入isTouched()在触地时,代码永远不会传递if语句,因为每次用户触摸屏幕时,他/她都会返回触地。

杨君之
2023-03-14

我认为它的工作原理是,你需要告诉libgdx你正在使用触摸控制。在文档中,它说您需要使用输入。设置InputProcessor(InputProcessor)。在我发现的示例中,他们使用:

Gdx.input.setInputProcessor(this);

他们把它放在类的构造函数中。我认为在你的玩家构造函数中应该没问题。

另外,如果你想让你的身体停下来,你需要告诉它停下来,就像你用键箭头做的那样。你需要添加这样的东西:

@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    velocity.y = 0;
    return true;
}
 类似资料:
  • 我制作了一个身体,我想在点击按钮时移动它,我已经能够使用但它不准确。假设我想以40的线速度移动我的身体7米,我该怎么做? 我可以用身体。setTransform()但我需要身体真正移动,而不是传送。提前谢谢

  • 我的任务是使用LibGdx游戏引擎在java中创建自己的碰撞物理引擎。这是自上而下的,所以忽略重力。我一直在琢磨如何对物体施加力。我通过求速度随时间的变化来求加速度。下面是如何找到x分量的加速度: 是x速度,和是一个,用于在不同时间存储速度的x分量(我使用的是均值定理)。基本上,我已经找到了x分量的加速度。现在如果我施加一个力,我做加速度*质量。这就是我完全困惑的地方。 F=ma.是的,所以我能够

  • 我在Java和Slick2D方面有几年的经验,我正试图将一个游戏移植到libgdx,因为它是一个更好的库。然而,我有一个简单的问题在屏幕上移动精灵。这个应用编程接口一定有一些我不理解的范例。我将我的代码提炼成以下内容。它识别输入,并在我的整个实体和网络系统中运行它,无论是在服务器上还是从服务器上,但是精灵保持在同一个位置。任何帮助都会很棒。 我的create()方法: getCurrentX/Y方

  • 我刚开始使用libgdx,在直线上移动身体时遇到了问题,我想在

  • 我试图在一个libgdx游戏中实现触摸滚动。我有一个很宽的图像,是一个房间的全景。我希望能够滚动图像,让用户可以看到房间的四周。我有它,所以我可以滚动一定的距离,但当一个新的触摸拖动事件被注册的图像被移回到原来的位置。 这就是我实现它的方式 } 在InputProcessor中 在这个问题LibGdx如何使用OrthographicCamera?滚动的帮助下,我做到了这一步?。然而,这并没有真正解

  • 我有一个名为“DisplayPanel”的类(它扩展了JPanel),我在那里画了一个正方形,它来自一个名为“square”的类(它扩展了JComponent)。如何使用键在JPanel中移动矩形? 正方形类有通常的绘制方法: “squarishThing”是一个普通矩形: 问题是:与“游戏库”不同,尝试“手动”做这样的事情是相当令人困惑的。我不知道“while循环”去哪里了。我试图在显示面板中放