我刚用libgdx开始了一个小项目,我注意到相机稍微滞后于鼠标。我正在这样做:(我已经删除了其他所有内容)
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
screenXlast = screenX;
screenYlast = screenY;
if (button == Input.Buttons.RIGHT || pointer > 0) {
rightMouseKlicked = true;
return true;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
if (button == Input.Buttons.RIGHT) {
rightMouseKlicked = false;
}
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
if (rightMouseKlicked) {
gamecam.translate((screenXlast - screenX) * gamecam.zoom, (screenY -
screenYlast) * gamecam.zoom);
}
screenXlast = screenX;
screenYlast = screenY;
return false;
}
游戏以60fps的速度运行,但似乎输出延迟了几帧。 (移动时鼠标光标不会停留在地图上的相同位置)
是否有其他方法可以做到这一点,以便相机保持鼠标?
答案 0 :(得分:0)
据我所知,libgdx中的事件会进入堆栈。事件发生后几毫秒就可以收到事件。
你可以看到,如果你绘制一个演员或触摸拖动事件位置的纹理 - 如果你快速拖动,你会看到绘制的纹理总是在鼠标后面(或手机上的取景器)。
正如@Jankapunkt所说,你可以尝试将位置乘以增量时间( Gdx.graphics.getDeltaTime()),但我不确定它会有所帮助
答案 1 :(得分:0)
您正在计算移动的屏幕像素,但不会缩放到相机视口的大小。如图所示进行修改:
public boolean touchDragged(int screenX, int screenY, int pointer) {
if (rightMouseKlicked) {
float scale = gamecam.zoom * gamecam.viewportWidth / (float)(Gdx.graphics.getWidth);
gamecam.translate((screenXlast - screenX) * scale , (screenY -
screenYlast) * scale );
}
screenXlast = screenX;
screenYlast = screenY;
return false;
}
另外请记住,典型鼠标的更新率非常低(我认为大约10 FPS)。如果您发现摄像机运动过于生涩,则必须计算鼠标移动速度并推断鼠标的位置并在其上添加平滑算法。 See here for discussion(3D但仍然普遍适用)。