无头/ CLI LibGDX

时间:2013-04-17 19:23:29

标签: java libgdx

我正在为服务器端编写一个小型的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)

3 个答案:

答案 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()之外,那么它应该可以得到你想要的东西。