无头/ CLI LibGDX

我正在为一个小型的LibGDX游戏编写服务器端代码,并且偶然发现了一个问题。 每次我尝试使用任何Gdx.files.*方法时,我都遇到了NullPointerException

显然这是因为我没有实现ApplicationListener,所以LibGDX尚未初始化。

有没有办法以无头/ CLI方式初始化LibGDX? 我需要能够在服务器端加载TiledMap对象。

 MapLoader(Request request) { TiledMap tmp = new TmxMapLoader().load("maps/" + request.name + ".tmx"); } 

com.esotericsoftware.kryonet.Server $ 1.received(Server.java:60)at com.tester.Example.server.ExampleServer $ 2.received(MapLoader.java:83)中的线程“Server”java.lang.NullPointerException中的exceptioncom.esotericsoftware.kryonet.Connection.notifyReceived(Connection.java:246)at com.esotericsoftware.kryonet.Server.update(Server.java:202)at com.esotericsoftware.kryonet.Server.run(Server.java:350)在java.lang.Thread.run(Thread.java:722)

我不建议将libGDX用于无头环境,它根本不是设计用于那种方式,并且随着libGDX团队更改框架,您将来可能会遇到问题。 然而,正如罗德指出的那样,完全有可能这样做,下面是你如何去做的片段。 要初始化Gdx.files全局,您需要在后端包中创建一个类并自己设置全局变量:

 package com.badlogic.gdx.backends.lwjgl; import com.badlogic.gdx.Gdx; public class Headless { public static void loadHeadless() { LwjglNativesLoader.load(); Gdx.files = new LwjglFiles(); } } 

其余的应该相当简单。 只需调用Headless.loadHeadless(); 在开始时,您应该能够使用您需要的部分框架。

正如我之前所说,我不建议这样做,但我没有找到任何使用libgdx与客户端/服务器架构的好解决方案。

编辑

不久前(在我最初写完这个答案之后),libgdx添加了一个无头后端 ,专为此目的而设计。 这是在无头环境中使用libgdx的正确和正确的方法,并且非常适合使用libgdx创建服务器。

截至2013年12月23日( 拉取请求#1018 ),libGDX有一个无头后端 ,您可以将其用于此目的。

看看LWJGL后端,特别是LwjglApplication.java 。 LwjglApplication的构造函数初始化所有Gdx。 *全局变量,如Gdx.files

如果你要从你自己的代码中调用构造函数中运行的步骤,除了调用initialize()之外 ,那么这应该可以得到你想要的东西。