报错:com.badlogic.gdx.backends.lwjgl包不存在,跨类调用getDesktopDisplayMode()失败
解决LibGDX中跨平台模块调用后端API的问题
嗨,这个问题其实是LibGDX跨平台架构下的典型模块职责问题,我来帮你理清楚:
为什么会报错?
你的MainMenuScreen应该是在core模块里(LibGDX的核心跨平台代码模块),而com.badlogic.gdx.backends.lwjgl包属于desktop平台专属模块的依赖。core模块的设计目标是兼容所有平台(Android、iOS、Desktop等),所以它不会包含任何平台特定的库依赖,直接导入后端包自然会提示“包不存在”。
推荐解决方案:用接口解耦平台代码(符合LibGDX设计理念)
这种方式既能拿到Desktop的显示尺寸,又不会破坏跨平台特性:
- 在core模块创建一个平台无关的接口
// core/src/[你的包名]/DisplayInfoProvider.java public interface DisplayInfoProvider { int getDesktopDisplayWidth(); int getDesktopDisplayHeight(); }
- 在desktop模块的
DesktopLauncher里实现这个接口
// desktop/src/[你的包名]/DesktopDisplayInfoProvider.java import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; public class DesktopDisplayInfoProvider implements DisplayInfoProvider { @Override public int getDesktopDisplayWidth() { return LwjglApplicationConfiguration.getDesktopDisplayMode().width; } @Override public int getDesktopDisplayHeight() { return LwjglApplicationConfiguration.getDesktopDisplayMode().height; } }
- 在DesktopLauncher启动游戏时,把这个实现类传递给core的游戏入口
// desktop/src/[你的包名]/DesktopLauncher.java public class DesktopLauncher { public static void main (String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); // 传递平台实现给核心游戏类 DisplayInfoProvider displayProvider = new DesktopDisplayInfoProvider(); new LwjglApplication(new MainGame(displayProvider), config); } }
- 在core的
MainGame里保存这个接口实例,供MainMenuScreen调用
// core/src/[你的包名]/MainGame.java public class MainGame extends ApplicationAdapter { private DisplayInfoProvider displayInfoProvider; public MainGame(DisplayInfoProvider displayInfoProvider) { this.displayInfoProvider = displayInfoProvider; } @Override public void create() { // 初始化MainMenuScreen时传入provider setScreen(new MainMenuScreen(displayInfoProvider)); } }
- 最后在
MainMenuScreen里使用这个接口获取尺寸
// core/src/[你的包名]/MainMenuScreen.java public class MainMenuScreen extends ApplicationAdapter { private DisplayInfoProvider displayInfoProvider; public MainMenuScreen(DisplayInfoProvider displayInfoProvider) { this.displayInfoProvider = displayInfoProvider; } @Override public void show() { int screenWidth = displayInfoProvider.getDesktopDisplayWidth(); int screenHeight = displayInfoProvider.getDesktopDisplayHeight(); // 这里就可以正常使用尺寸了 } }
简化方案:用LibGDX跨平台API获取显示模式
如果你只是想获取当前运行平台的显示模式,其实LibGDX已经提供了跨平台的API,不需要依赖后端类:
// 在MainMenuScreen里直接调用 int currentWidth = Gdx.graphics.getDisplayMode().width; int currentHeight = Gdx.graphics.getDisplayMode().height;
这个方法在所有平台都能正常工作,除非你明确需要获取Desktop系统的原生显示模式(比如还没启动游戏窗口时的尺寸),否则这个方案更简单。
额外提醒
确保你的项目模块职责清晰:
- core模块只包含跨平台通用代码,不要引入任何平台特定依赖
- desktop/android/ios等模块只负责各自平台的启动和平台特定逻辑,再通过接口传递给core模块
内容的提问来源于stack exchange,提问作者user8704018
相关产品推荐
相关产品推荐

