Java 使用inputprocessor使对象跟随触摸输入的x轴,对象会变得疯狂
所以我希望它能让用户在触摸屏幕时,物体沿着touchpos的x轴移动。当我使用轮询(Gdx.input.getX())执行此操作时,它的工作方式是必须的。但使用输入处理器,当触摸屏幕时,整个屏幕上的物体都会发疯。我真的不明白为什么。这是密码 Player.java: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)
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)代码>成功了!考虑用注释编辑答案,这样答案就完成了。