libgdx:使用相机测试屏幕外是否有对象

时间:2014-01-26 18:05:48

标签: java libgdx

我按照this示例创建了一个雪花对象池。当它离开屏幕时它会被释放。 我的问题是我无法访问WorldRenderer的相机以便使用:pointInFrustrum()。我通过使相机静止来解决这个问题。 还有另一种方法可以找出雪花是否在屏幕之外或者是否能够获得相机的当前位置?这似乎不是一个好的解决方案。

Snowflake.java:

 public void update (float delta){

    // update snowflake position
    position.add(0, -1*delta*5);

    // if snowflake is out of screen, set it to dead
    if(!WorldRenderer.cam.frustum.pointInFrustum(new Vector3(position.x, position.y, 0))) {
        alive = false;
    }
}

World更新方法中的同样问题。我需要访问相机才能找到y位置:

 private void updateSnowflakes(float deltaTime) {
    spawnTime += deltaTime;
    if(spawnTime > spawnDelay) {
        spawnTime = 0;
        Snowflake item = snowflakePool.obtain();
        float x = rand.nextFloat() * Helper.FRUSTUM_WIDTH;
        float y = WorldRenderer.cam.position.y + Helper.FRUSTUM_HEIGHT/2;
        item.init(x, y);
        activesSnowflakes.add(item);
    }

    int len = activesSnowflakes.size;
    for (int i = len; --i >= 0;) {
        Snowflake item = activesSnowflakes.get(i);
        if (item.alive == false) {
            activesSnowflakes.removeIndex(i);
            snowflakePool.free(item);
        } else {
            item.update(deltaTime);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

如果您需要其他类中的worldrendered cam。您需要将其作为参数发送。你的方法也不错。只是不要忘记在WorldRendered构造函数中初始化静态相机,因为它可以在之前的运行中存活。

在这里,你每帧都会创建一个新的Vector,这会让垃圾收集器非常难过。不要这样做。

if(!WorldRenderer.cam.frustum.pointInFrustum(new Vector3(position.x, position.y, 0))) {