java - libgdx:使用相机测试对象是否超出屏幕

标签 java libgdx

我关注了this创建雪花对象池的示例。当它离开屏幕时它会被释放。 我的问题是我无法访问 WorldRenderer 的相机以使用:pointInFrustrum()。我通过使相机静止来解决这个问题。 是否有另一种方法可以确定雪花是否超出屏幕或获取相机的当前位置?这似乎不是一个好的解决方案。

雪花.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);
        }
    }
}

最佳答案

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

在这里你每帧都创建一个新的Vector,这会让垃圾收集器很伤心。不要这样做。

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

关于java - libgdx:使用相机测试对象是否超出屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21367186/

相关文章:

java - 在运行用户提供的 Java 代码时,我应该防范哪些安全风险?

java - 带有 url 模式的 Tomcat 问题

java - Android LibGDX 着色器兼容性

java - LibGDX 自动缩放标签中的文本

Java-如何从同一个包中的类获取私有(private)数据

java - Eclipse 项目与构建路径

java - 使用自定义 getter 为我不拥有的类反序列化 JSON

java - 如何使用 Intellij 创建 Libgdx jar 文件?

java - libgdx 瓦片 map 中的单位比例

java - Libgdx 表组件未正确显示