【问题标题】:LibGDX How To Use Multiple Viewports/ Cameras?LibGDX 如何使用多个视口/相机?
【发布时间】:2016-06-11 20:40:55
【问题描述】:

在我目前正在开发的 LibGDX 游戏中,我遇到了关于视口的问题。我正在尝试创建两个视口——一个包含整个屏幕,包括控件,另一个在第一个中间保存游戏的视觉效果。 This is what I mean.

但是,我在使用这些视口时遇到了问题。首先,在FitViewportapply 中渲染的平铺地图和玩家是不可见的(无论是不渲染还是在可见屏幕空间之外),但是我的Rayhandler 的光是可见的(并且传播得比它更多分配 1:1 的比例)。 Proof.

private OrthographicCamera camera;    
Viewport v1;
Viewport v2;
//...
RayHandler devRay;
//...
TiledMap map;
OrthogonalTiledMapRenderer tmr;
Player player;

@Override
public void show() {    
    camera = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
    camera.setToOrtho(false,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
    //...
    v1 = new ScreenViewport();
    v2 = new FitViewport(160, 160, camera);
    //...
    tmr = new OrthogonalTiledMapRenderer(map);
    tmr.setView(camera);
    RayHandler.useDiffuseLight(true);
    devRay = new RayHandler(world);
}
public void render(float delta) {

    Gdx.gl.glClearColor(1,1,1,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    v1.apply();
    //Draw Controls

    v2.apply();
    //Draw Visuals  
    tmr.render(); //Tiled Map Renderer
    player.render();
    devRay.updateAndRender();
    //...
}   

我猜我完全错过了视口的要点。我想知道是否有任何方法可以将项目中的可玩区域和控制区域分开,例如,我可以移动FitViewport 的相机,而游戏视图不会占用超过 1:1 的比例。感谢您的帮助!

【问题讨论】:

    标签: opengl camera libgdx rendering viewport


    【解决方案1】:

    我通常做的是用一个相机来渲染世界,然后通过在最后一个 stage.draw() 上绘制舞台来覆盖平视显示器。舞台非常适合这一点。显然,这会掩盖一些在没有 hud 的情况下通常应该可见的游戏世界,所以如果你真的想要多个“视口”,那么你必须使用 Viewports

    视口易于实现并为您处理一切if you pick the correct one。设置好相机后,您可以像这样创建视口:

        camera = new OrthographicCamera(1920 / 2, 1080);
        //1920, 1080 for sake of example. This could be anything and it is often
        // better to not think in pixels but in world units.
    
        viewport = new FitViewport(camera.viewportWidth, camera.viewportHeight, camera);
        viewport.setScreenBounds(0, 0, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight());
    

    这将使用setScreenBounds(...) 在屏幕的左半边创建一个视口。由于我们在相机上绘制的东西只有屏幕的一半,我们必须匹配纵横比,否则它会显得拉伸。

    为了澄清,因为有时这有点令人困惑:

    float worldWidth, worldHeight; // How much of the world to display
    viewport = new FitViewport(worldWidth, worldHeight, camera);
    
    int screenPosX, screenPosY, screenWidth, screenHeight; 
    // The position of the viewport where 0, 0 is bottom left and 
    // Gdx.graphcis.getWidth, Gdx.graphics.getHeight is top right
    viewport.setScreenBounds(screenPosX, screenPosY, screenWidth, screenHeight);
    

    您实际上不需要指定您的相机宽度和高度,因为一旦您点击vp.apply() 并将相机连接到 vp,它就会被覆盖。

    update() 方法中,在该特定视口上绘制任何内容之前,您必须先应用视口viewport.apply()

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。 Official Documentation有答案。

      多个视口 当使用具有不同屏幕尺寸的多个视口时(或者您使用其他设置 glViewport 的代码),您需要在绘制之前应用视口,以便为该视口设置 glViewport。

      viewport1.apply();
      // draw
      viewport2.apply();
      // draw
      

      当使用多个阶段时:

      stage1.getViewport().apply();
      stage1.draw();
      stage2.getViewport().apply();
      stage2.draw();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 2012-12-05
        • 1970-01-01
        相关资源
        最近更新 更多