我正在为服务器端编写一个小型的LibGDX游戏,并且偶然发现了一个问题。每当我尝试使用任何Gdx.files.*
方法时,我都会遇到NullPointerException
。
显然这是因为我没有实现ApplicationListener,所以LibGDX尚未初始化。
有没有办法以无头/ CLI方式初始化LibGDX?我需要能够在服务器端加载TiledMap对象。
MapLoader(Request request)
{
TiledMap tmp = new TmxMapLoader().load("maps/" + request.name + ".tmx");
}
线程“Server”中的异常java.lang.NullPointerException at com.tester.Example.server.ExampleServer $ 2.received(MapLoader.java:83) 在com.esotericsoftware.kryonet.Server $ 1.received(Server.java:60)at com.esotericsoftware.kryonet.Connection.notifyReceived(Connection.java:246) 在com.esotericsoftware.kryonet.Server.update(Server.java:202)at com.esotericsoftware.kryonet.Server.run(Server.java:350)at java.lang.Thread.run(Thread.java:722)
答案 0 :(得分:4)
截至2013年12月23日(pull request #1018),libGDX有一个headless backend,您可以将其用于此目的。
答案 1 :(得分:3)
我不建议将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添加了headless backend,这是为了这种目的而设计的。这是在无头环境中使用libgdx的正确和正确的方法,并且非常适合使用libgdx创建服务器。
答案 2 :(得分:2)
看看LWJGL后端,特别是LwjglApplication.java。 LwjglApplication 的构造函数初始化所有 Gdx。 *全局变量,例如 Gdx.files 。
如果你要从你自己的代码调用构造函数中运行的步骤,除了调用 initialize()之外,那么它应该可以得到你想要的东西。