java - 使用输入处理器使对象遵循触摸输入的 x 轴,对象会变得疯狂

标签 java libgdx

所以我希望当用户触摸屏幕时,对象遵循触摸位置的 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);

不为您提供未投影 vector 的副本。它正在修改输入 Vector2 并返回相同的引用。由于您的输入处理器仅在您着陆时重置其 Vector2,因此只要您按住手指,您的 Player 类就会在每一帧上取消投影相同的 vector 。在同一 vector 上多次调用 unproject 显然会开始产生垃圾结果。

因此,为此请准备好您自己的额外 Vector 2。

private final Vector2 unprojectedTouchPos = new Vector2();

然后将触摸位置 vector 复制到每一帧上的此 vector 中,并使用此 vector :

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

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

screenTouchPos.set(screenX, screenY);

关于java - 使用输入处理器使对象遵循触摸输入的 x 轴,对象会变得疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049825/

相关文章:

java - 在android studio中显示每个for循环迭代输出

java - 如何将外部 CSS 添加到 HTML 'style'

java - LibGDX 将 BitmapFont 绘制到中间位置(spritebatch)

java - 在 EWS api 的帮助下使用 java 创建带有附件的 Outlook 日历定期 session

java - 需要从 google 关键字外部工具中提取结果?

java - Java 中的 asSingleEntity()

java - 如何让 ADmob 横幅广告显示在 Libgdx 中

java - 如何在android中停止触摸事件所需的时间?

android - LibGDX 的 TexturePacker 与 gradle

java - 从一点旋转正交相机 (LibGdx)