单击按钮以在Libgdx中重复执行代码

时间:2018-03-22 14:40:01

标签: button libgdx

我在3D空间中使用Libgdx开发了一个Android应用程序来渲染一些带有交互按钮的建筑物,以帮助用户在环境中导航。例如,左右按钮可以向左和向右移动相机。按下按钮导致执行一次代码,我已经使用这个技巧继续执行代码,因为用户按住按钮。

Collection.reverse(datalist);

此方法在AndroidListener的create()函数中调用,舞台也将在render()函数中绘制。有大约12个按钮使用相同的方法,但它给我一些滞后的渲染过程,而用户按住按钮几秒钟或同时按下两个按钮。这种方法有问题,还是经常执行代码的适当结构?

1 个答案:

答案 0 :(得分:1)

Camera不是一个线程安全的类,因此如果从后台线程修改它,则需要使用同步。

也就是说,更新相机是一项微不足道的操作,因此多线程增加了许多不必要的复杂性。你生成了相当数量的垃圾,虽然我不知道这是否是你看到一些滞后的唯一原因。

以下是我如何更简单地做到这一点。

stage = new Stage();
float camSpeed = 0.5f / 15; // Units per ms
float camDisp = camSpeed * Gdx.graphics.getDeltaTime();
buttonLeft = new TextButton("", leftStyle){
    public void act(float delta){
        super.act(delta);
        if (isPressed()){
            camera.position.add(camera.direction.z * camDisp, 
                                0, 
                                -camera.direction.x * camDisp);
            camera.update();
        }
    }
}

不太清楚你对相机方向做了什么,但我试图复制相同的行为。如果我只想将相机向左平移,我就这样做。 temp变量是为了避免实例化对象并触发GC。

private static final Vector3 TMP = new Vector3();

//...

TMP.set(camera.direction).crs(camera.up); // right vector of camera
camera.position.add(TMP.scl(-camDisp));