You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX如何设置Viewport实现1920x1080内容自适应屏幕?

解决LibGDX中1920x1080内容自适应不同屏幕的问题

你的核心问题在于只使用了OrthographicCamera但没有结合Viewport处理屏幕适配,导致相机视口比例和实际屏幕比例不匹配,出现内容无法填满屏幕的情况。下面是具体修复方案,让你的1920x1080内容在任何屏幕上都能保持一致的显示效果:

步骤1:选择合适的Viewport类型

LibGDX提供了几种Viewport,根据你“保持显示效果一致”的需求,推荐两种常用类型:

  • FitViewport:严格保持1920x1080的宽高比,缩放内容后居中显示,屏幕比例不匹配时边缘会留黑边(不会拉伸变形)。
  • ExtendViewport:保持宽高比,短边填满屏幕,长边扩展世界范围(无黑边,但会显示更多内容,适合场景类游戏)。

这里我们以FitViewport为例,它最贴合你的需求。

步骤2:修改MainMenu类的代码

2.1 添加Viewport字段

在MainMenu类中新增Viewport成员变量:

private Main game;
private OrthographicCamera cam;
private Viewport viewport; // 新增Viewport字段

2.2 初始化Viewport

在构造函数中替换原有相机初始化逻辑,改用Viewport管理相机:

public MainMenu(final Main game) {
    this.game = game;
    cam = new OrthographicCamera();
    // 初始化FitViewport,传入目标世界尺寸:1920x1080
    viewport = new FitViewport(1920, 1080, cam);
    // 无需手动调用cam.setToOrtho(false, 1920, 1080),Viewport会自动处理相机投影
}

2.3 重写resize方法

屏幕尺寸变化(如切换全屏、调整窗口大小)时,必须更新Viewport适配新尺寸:

@Override
public void resize(int width, int height) {
    // 更新Viewport,第二个参数true表示内容居中显示
    viewport.update(width, height, true);
    // 确保相机位置居中(适配你的内容布局)
    cam.position.set(1920 / 2f, 1080 / 2f, 0);
    cam.update();
}

2.4 调整render方法

在render中使用Viewport绑定的相机投影矩阵:

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0.025f, .025f, 0.025f, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
    cam.update();
    // 使用Viewport管理的相机投影矩阵
    game.batch.setProjectionMatrix(cam.combined);
    
    game.batch.begin();
    // 继续用1920x1080的坐标绘制内容,比如:
    // game.batch.draw(menuBg, 0, 0, 1920, 1080);
    game.batch.end();
    
    if(Gdx.input.isKeyPressed(Keys.ESCAPE)) {
        Gdx.app.exit();
    }
}

步骤3:输入适配(可选但重要)

如果游戏有点击、触摸交互,需要将屏幕坐标转换为世界坐标,避免点击位置偏移:

// 在输入处理逻辑中添加
Vector3 touchPos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
// 用Viewport将屏幕坐标转换为1920x1080的世界坐标
viewport.unproject(touchPos);

// 现在touchPos.x和touchPos.y就是对应世界中的位置,可用于点击检测
if(touchPos.x > 500 && touchPos.x < 700 && touchPos.y > 400 && touchPos.y < 600) {
    // 处理按钮点击事件
}

为什么原来的代码会出问题?

你之前直接设置cam.setToOrtho(false, 1920, 1080),但没有将相机投影矩阵与实际屏幕尺寸关联。当屏幕是1440x800时,其宽高比(1.8)和1920x1080的宽高比(≈1.777)略有差异,相机无法自动缩放适配,导致内容不能填满屏幕,出现顶部空白。而Viewport会自动计算缩放比例,将世界坐标精准映射到屏幕坐标,保持内容的比例和显示效果一致。

内容的提问来源于stack exchange,提问作者Ryan Buxton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:52