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
相关产品推荐
相关产品推荐

