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