在libgdx中移动相机没有滞后

时间:2016-03-16 03:32:11

标签: java camera libgdx lag

我刚用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的速度运行,但似乎输出延迟了几帧。 (移动时鼠标光标不会停留在地图上的相同位置)

是否有其他方法可以做到这一点,以便相机保持鼠标?

2 个答案:

答案 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但仍然普遍适用)。