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

libGDX窗口调整后getWidth()与getHeight()方法异常求助

解决libGDX窗口缩放异常问题

你遇到的问题核心是窗口大小变化时,ShapeRenderer的投影矩阵没有同步更新,默认的ApplicationAdapter不会自动处理视口适配,直接用Gdx.graphics.getWidth()/getHeight()画图形会导致显示异常。

修复方案1:重写resize方法并更新投影矩阵

在你的Metroidvania类里添加resize方法,手动更新ShapeRenderer的正交投影矩阵,确保图形始终适配当前窗口尺寸:

public class Metroidvania extends ApplicationAdapter {
    ShapeRenderer s;
    OrthographicCamera camera;

    @Override
    public void create () {
        s = new ShapeRenderer();
        camera = new OrthographicCamera();
    }

    @Override
    public void render () {
        ScreenUtils.clear(1, 1, 1, 1);
        
        camera.update();
        s.setProjectionMatrix(camera.combined);
        
        s.begin(ShapeRenderer.ShapeType.Filled);
        s.setColor(0, 0, 0, 1);
        s.rect(0, 0, camera.viewportWidth, camera.viewportHeight);
        s.end();
    }

    @Override
    public void resize(int width, int height) {
        camera.setToOrtho(false, width, height);
    }

    @Override
    public void dispose () {
        s.dispose();
    }
}

修复方案2:使用Viewport(libGDX推荐方式)

Viewport是libGDX专门用于处理屏幕适配的工具,能更灵活应对不同窗口/屏幕尺寸,比如保持固定纵横比:

public class Metroidvania extends ApplicationAdapter {
    ShapeRenderer s;
    OrthographicCamera camera;
    Viewport viewport;
    // 设定固定虚拟分辨率,示例为1280x720
    private static final int VIRTUAL_WIDTH = 1280;
    private static final int VIRTUAL_HEIGHT = 720;

    @Override
    public void create () {
        s = new ShapeRenderer();
        camera = new OrthographicCamera();
        // FitViewport会保持纵横比,用黑边填充剩余区域
        viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);
    }

    @Override
    public void render () {
        ScreenUtils.clear(1, 1, 1, 1);
        
        camera.update();
        s.setProjectionMatrix(camera.combined);
        
        s.begin(ShapeRenderer.ShapeType.Filled);
        s.setColor(0, 0, 0, 1);
        // 基于虚拟分辨率绘制,Viewport自动适配窗口
        s.rect(0, 0, VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
        s.end();
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
    }

    @Override
    public void dispose () {
        s.dispose();
    }
}

关键说明

  • Gdx.graphics.getWidth()/getHeight()是窗口原始像素尺寸,但ShapeRenderer需要基于相机投影矩阵绘制,否则窗口缩放后坐标系统会混乱。
  • 重写resize方法是必须的,每次窗口大小变化时都会触发该方法,用来同步视口和相机参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:15:36