Camera 舞台、视口、摄影机、缩放和Nexus 7

Camera 舞台、视口、摄影机、缩放和Nexus 7,camera,libgdx,viewport,scaling,stage,Camera,Libgdx,Viewport,Scaling,Stage,我是Android的新手,我也在学习如何使用libgdx。我发现了一些使用“DisplayScreen扩展AbstractScreen”编码技术的教程,它们使用Stage和Actor来显示输出。我对这种编码技术的解释是,DisplayScreen将使用AbstractScreen中的任何内容,除非它是@Override(如果我错了,请纠正我) 因此,如果我将代码放在AbstractScreen resize()中,以将显示缩放到更大的屏幕,同时保持纵横比;显示屏中的舞台应调整其大小以适应更大的屏

我是Android的新手,我也在学习如何使用libgdx。我发现了一些使用“DisplayScreen扩展AbstractScreen”编码技术的教程,它们使用Stage和Actor来显示输出。我对这种编码技术的解释是,DisplayScreen将使用AbstractScreen中的任何内容,除非它是@Override(如果我错了,请纠正我)

因此,如果我将代码放在AbstractScreen resize()中,以将显示缩放到更大的屏幕,同时保持纵横比;显示屏中的舞台应调整其大小以适应更大的屏幕。主要目标是我只想将我的游戏开发集中在800x480环境中,而完全忽略所有不同的大小/分辨率。AbstractScreen中的resize()将完成所有艰苦的工作,以使我的游戏适应任何分辨率

请允许我使用我的测试示例进行更好的解释。我可以在手机上显示800x480黑色背景。但是,在Nexus7上显示了相同的背景,但没有保持其纵横比

这解决了我上面提到的问题(我采用了在屏幕两侧都有两个黑条)。但是,我在将此解决方案与“DisplayScreen extends AbstractScreen”技术集成时遇到了一个小问题

请看这个屏幕截图。我的问题是:

  • 为什么我的黑框没有调整大小以适应屏幕,却在屏幕两侧留下两个红色条
  • 我不明白为什么Nexus 7上的黑色图像只显示766x480
  • 如果有人能给我指出正确的方向,那就太棒了

    令人敬畏的游戏代码

    package com.example.somegame;
    
    import com.badlogic.gdx.Game;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.Screen;
    import com.badlogic.gdx.assets.AssetManager;
    import com.example.somegame.screens.DisplayScreen;
    
    public class awesomegame extends Game {
    
    public static AssetManager AssetManager = new AssetManager();
    
    @Override
    public void create() {
    }
    
    @Override
    public void render() {
        super.render();
    }
    
    @Override
    public void resize(int width, int height) {
        super.resize(width, height);
        setScreen( new DisplayScreen(this) );
    
    }
    
    @Override
    public void setScreen(Screen screen) {
        super.setScreen( screen );
    }
    
    抽象屏幕代码

    package com.example.somegame.screens;
    
    import com.example.somegame.awesomegame;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.Screen;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.OrthographicCamera;
    import com.badlogic.gdx.graphics.g2d.BitmapFont;
    import com.badlogic.gdx.graphics.g2d.SpriteBatch;
    import com.badlogic.gdx.math.Vector2;
    import com.badlogic.gdx.scenes.scene2d.Stage;
    import com.badlogic.gdx.utils.Scaling;
    
    public class AbstractScreen implements Screen{
    
    private awesomegame awesomegame;
    private Stage stage;
    
    private BitmapFont font;
        private SpriteBatch batch;
    private OrthographicCamera camera;
    
    public AbstractScreen(awesomegame awesomegame) {
        this.awesomegame = awesomegame;
    
        camera = new OrthographicCamera();
        camera.setToOrtho(false, 800, 480);
        camera.update();
    
        stage = new Stage(800, 480, false);
    }
    
    @Override
    public void render(float delta) {
        stage.act( delta );
        Gdx.gl.glClearColor( .5f, .5f, 0f, 1f );
        Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT );
    
        stage.draw();
    }
    
    @Override
    public void resize(int width, int height) {
        Vector2 size = Scaling.fit.apply(800, 480, width, height);
        int viewportX = (int)(width - size.x) / 2;
        int viewportY = (int)(height - size.y) / 2;
        int viewportWidth = (int)size.x;
        int viewportHeight = (int)size.y;
        Gdx.gl.glViewport(viewportX, viewportY, viewportWidth, viewportHeight);
        stage.setViewport(800, 480, true);
    }
    
    显示屏代码

    package com.example.somegame.screens;
    
    import com.example.somegame.awesomegame;
    
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.g2d.TextureAtlas;
    import com.badlogic.gdx.scenes.scene2d.Stage;
    import com.badlogic.gdx.scenes.scene2d.ui.Image;
    
    public class DisplayScreen extends AbstractScreen {
    
    private Image loadingBg;
    
    private Stage stage;
    
    float loadingPercent;
    
    public DisplayScreen(awesomegame awesomegame) {
        super (awesomegame);
    }
    
    @Override
    public void show()
    {
        super.show();
    
        awesomegame.AssetManager.load("img/loading.atlas", TextureAtlas.class);
        awesomegame.AssetManager.finishLoading();
    
        stage = new Stage();
    
        TextureAtlas atlas = awesomegame.AssetManager.get("img/loading.atlas", TextureAtlas.class);
    
    
        loadingBg = new Image(atlas.findRegion("loadingBg"));
    
        loadingBg.setSize(800, 480);
        loadingBg.setX(0);
        loadingBg.setY(0);
    
        stage.addActor(loadingBg);
    
        // add all asset need to be loaded here. for example
        // awesomegame.AssetManager.load("img/whatever.pack", TextureAtlas.class);
    
    }
    
    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor( 1f, 0f, 0f, 1f );
        stage.draw();
    
    }
    

    Nexus 7的屏幕分辨率为1280 x 800,但部分高度用于屏幕菜单面板(带有后退/主页/菜单按钮)

    代码中的罪魁祸首是这里,在这里,您试图强制执行一个特定的长宽比,该长宽比不适合调整后的尺寸,从而导致在侧面出现这些条:

    public void resize(int width, int height) {
        Vector2 size = Scaling.fit.apply(800, 480, width, height);
        ...
    }
    
    看起来您从另一个stackoverflow post中删除了
    resize
    功能。我也做了同样的事情,但当我遇到同样的问题时,我转向了更简单的事情:

    public void resize(int width, int height) {
        stage.setViewport(true, width,height);
        stage.getCamera().setToOrtho(false,width,height);
        ...
    }
    

    此代码适用于我的最新更新:

    正交摄影机是cam,这不会进行裁剪,只是更改视口,使其宽度仍然比实际窗口/设备大“许多”倍

    public void resize(int width, int height) {
        int newW = width, newH = height;
        if (cam.viewportWidth > width) {
            float scale = (float) cam.viewportWidth / (float) width;
            newW *= scale;
            newH *= scale;
        }
    
        // true here to flip the Y-axis
        cam.setToOrtho(true, newW, newH);
    }