8

我正在为一个小型 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) 的 com.tester.Example.server.ExampleServer$2.received(MapLoader.java:83) 的线程“服务器”中的异常 java.lang.NullPointerException com.esotericsoftware.kryonet.Connection.notifyReceived(Connection.java:246) 在 com.esotericsoftware.kryonet.Server.update(Server.java:202) 在 com.esotericsoftware.kryonet.Server.run(Server.java:350)在 java.lang.Thread.run(Thread.java:722)

4

3 回答 3

6

我不建议将 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-04-24T04:00:27.723 回答
6

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

于 2014-06-25T03:46:51.893 回答
2

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

如果您要从您自己的代码调用在构造函数中运行的步骤,除了对initialize()的调用,那么这应该会得到您想要的。

于 2013-04-22T11:47:56.123 回答