Libgdx 渲染纹理 vs 精灵

4

我正尝试使用Libgdx和Box2d构建我的第一个游戏。 这个游戏的概念与Flappy Bird相似。 我的问题在于如何呈现管道。

我尝试绘制矩形,然后绘制新的精灵,每次调用渲染方法时可以将其缩小到不同的管道大小。 这样做的问题是,一旦矩形离开屏幕,我就无法处理它的纹理,因为它会使所有其他仍然可见的矩形失去纹理。 如果我不在矩形离开屏幕时处理纹理,那么20秒后游戏将变得非常缓慢。

另一种选择是为不同的管道大小使用大约10种不同的纹理,但仍然存在处理纹理的问题。

我希望有任何建议如何高效地渲染不同的管道大小。 我在下面附上了我的渲染代码

  @Override
public void render(float delta) {
    Gdx.gl.glClearColor(0,0,0,0);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    world.step(BOX_STEP, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS);

    batch.setProjectionMatrix(camera.combined);

    batch.begin();
    //background.setPosition(camera.position.x-camera.viewportWidth/2, camera.position.y-14);
    //background.draw(batch);
    batch.end();

    //bg1.update();
    //bg2.update();

    updateAnimation();

    if((TimeUtils.nanoTime()/10) - (lastDropTime/10) > 300000000) 
        createPipes();

       batch.begin();

       for(Rectangle raindrop: raindrops) {
              pipe_top.setSize(4, raindrop.height);
          pipe_top.setPosition(raindrop.x,  raindrop.y);
          pipe_top.draw(batch);

          pipe_bottom.setSize(4, raindrop.height);
          pipe_bottom.setPosition(raindrop.x, camera.position.y + (camera.viewportHeight/2-pipe_bottom.getHeight()));
          pipe_bottom.draw(batch);

       }
       batch.end();

       if(pipe.getX() < 0){
           pipe.getTexture().dispose();
       }

       Iterator<Rectangle> iter = raindrops.iterator();
          while(iter.hasNext()) {
             Rectangle raindrop = iter.next();
             raindrop.x -= 4 * Gdx.graphics.getDeltaTime();

             if(raindrop.x  < -35) iter.remove();

          }

    debug.render(world, camera.combined);
}
1个回答

2
你需要尽可能快地维护render()方法。加载资源相当缓慢,因此应在create()方法中创建纹理和精灵。
此外,你不需要像雨滴那样拥有太多的精灵,你可以重复使用相同的精灵,改变其位置和大小,并多次绘制它。
希望这能帮到你。

我试过了,但游戏仍然变得非常慢,我需要一种在图像不再可见时处理它而不影响其他图像的方法。也许我还做错了其他事情。 - user2510952
你能用更新后的代码更新问题吗?另外,createPipes() 函数做了什么? - Aurel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接