Java 使用inputprocessor使对象跟随触摸输入的x轴,对象会变得疯狂

Java 使用inputprocessor使对象跟随触摸输入的x轴,对象会变得疯狂,java,libgdx,Java,Libgdx,所以我希望它能让用户在触摸屏幕时,物体沿着touchpos的x轴移动。当我使用轮询(Gdx.input.getX())执行此操作时,它的工作方式是必须的。但使用输入处理器,当触摸屏幕时,整个屏幕上的物体都会发疯。我真的不明白为什么。这是密码 Player.java: public class Player extends Entity { MyInputProcessor input; public Player(float x, float y, Sprite sprite)

所以我希望它能让用户在触摸屏幕时,物体沿着touchpos的x轴移动。当我使用轮询(Gdx.input.getX())执行此操作时,它的工作方式是必须的。但使用输入处理器,当触摸屏幕时,整个屏幕上的物体都会发疯。我真的不明白为什么。这是密码

Player.java:

public class Player extends Entity
{
    MyInputProcessor input;

    public Player(float x, float y, Sprite sprite)
    {
        super(x, y, sprite);
        input = new MyInputProcessor();
        Gdx.input.setInputProcessor(input);
    }

    public void update(final Application app)
    {
        handleInput(app);
        super.update();
    }

    public void handleInput(Application app)
    {
        if (input.touchDown)
        {
            Vector2 touchPos = app.viewport.unproject(input.screenTouchPos);
            position.x = touchPos.x - sprite.getWidth() / 2;
        }
    }
}
MyInputProcessor.java:

public class MyInputProcessor implements InputProcessor
{
    public boolean touchDown = false;
    public Vector2 screenTouchPos;

    public MyInputProcessor()
    {
        screenTouchPos = new Vector2();
    }

    @Override
    public boolean keyDown(int keycode)
    {
        return false;
    }

    @Override
    public boolean keyUp(int keycode)
    {
        return false;
    }

    @Override
    public boolean keyTyped(char character)
    {
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button)
    {
        touchDown = true;
        screenTouchPos.set(screenX, screenY);
        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button)
    {
        touchDown = false;
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer)
    {
        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY)
    {
        return false;
    }

    @Override
    public boolean scrolled(int amount)
    {
        return false;
    }
}
这条线

Vector2 touchPos = app.viewport.unproject(input.screenTouchPos);
不提供未投影向量的副本。它正在修改输入向量2并将相同的引用返回给您。由于您的输入处理器仅在触摸时重置其矢量2,因此只要您按住手指,您的播放器类将在每一帧上取消投影相同的矢量。在同一个向量上多次调用unproject显然会产生垃圾结果

因此,相反,将自己的额外向量2放在手边

private final Vector2 unprojectedTouchPos = new Vector2();
然后将触摸位置向量复制到每个帧上的该向量中,并改用该向量:

public void handleInput(Application app)
{
    if (input.touchDown)
    {
        unprojectedTouchPos.set(input.screenTouchPos);
        app.viewport.unproject(unprojectedTouchPos);
        position.x = unprojectedTouchPos.x - sprite.getWidth() / 2;
    }
}

编辑: 根据您的评论,您还希望在手指拖动时实时更新位置,因此将此添加到InputProcessor的
TouchDrawed
方法:

screenTouchPos.set(screenX, screenY);

我试过了,但它不能连续地匹配x轴。只有第一次它会去触摸的地方。要再次获得一个动作,我必须放开并再次按住它。将此添加到InputProcessor的
TouchDrawed
方法:
screenTouchPos.set(screenX,screenY)成功了!考虑用注释编辑答案,这样答案就完成了。