我见过与此类似的问题,但没有一个与我在 Libgdx 项目中遇到的问题相匹配(仅限桌面)。我使用 Tiled 制作了一个 .tmx 地图并将其复制到 assets 文件夹,该文件夹有两个子包:gameScreens(带有地图)和瓷砖。如果我使用 Tiled 从 Eclipse 打开 .tmx 地图,它工作得很好。这是.tmx:
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="8" height="8" tilewidth="32" tileheight="32">
<tileset firstgid="1" name="default" tilewidth="32" tileheight="32">
<tile id="0">
<image width="32" height="32" source="../tiles/rock.png"/>
</tile>
<tile id="1">
<image width="32" height="32" source="../tiles/tile_default_1.jpg"/>
</tile>
<tile id="2">
<image width="32" height="32" source="../tiles/tile_default_2.jpg"/>
</tile>
<tile id="3">
<image width="32" height="32" source="../tiles/wall.png"/>
</tile>
</tileset>
<layer name="Camada de Tiles 1" width="8" height="8">
<data encoding="base64" compression="gzip">
eJxjYWBgYCGAmXFgZHlGJHFGLPKU8okxH5f78GEAbrAA2Q==
</data>
</layer>
</map>
我创建了一个抽象类 GameState:
package com.mygdx.cavedive.game.GameStates;
//imports
public abstract class GameState {
private static TmxMapLoader mapLoader = new TmxMapLoader();
protected static OrthogonalTiledMapRenderer otmr;
protected static OrthographicCamera cam;
protected OrthogonalTiledMapRenderer getRenderer() {
return otmr;
}
protected TmxMapLoader getMapLoader() {
return mapLoader;
}
protected void disposeRenderer() {
otmr.dispose();
}
}
和一个扩展它的类:
package com.mygdx.cavedive.game.GameStates;
//imports
public class Level_1 extends GameState implements Screen {
private TiledMap map;
@Override
public void render(float delta) {
//Clear the screen
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
otmr.setView(cam);
//Render the screen
otmr.render();
}
@Override
public void resize(int width, int height) {
cam.viewportWidth = width;
cam.viewportHeight = height;
cam.update();
}
@Override
public void show() {
map = getMapLoader().load("gameScreens/level1.tmx");
otmr = new OrthogonalTiledMapRenderer(map, 1f / 32f);
cam = new OrthographicCamera();
}
@Override
public void hide() {
dispose();
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
disposeRenderer();
map.dispose();
}
}
现在这是我得到的:
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.badlogic.gdx.maps.tiled.TmxMapLoader.loadTilesets(TmxMapLoader.java:246)
at com.badlogic.gdx.maps.tiled.TmxMapLoader.load(TmxMapLoader.java:118)
at com.badlogic.gdx.maps.tiled.TmxMapLoader.load(TmxMapLoader.java:104)
at com.mygdx.cavedive.game.GameStates.Level_1.show(Level_1.java:40)
at com.badlogic.gdx.Game.setScreen(Game.java:61)
at com.mygdx.cavedive.game.App.GameCore.create(GameCore.java:28)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:136)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
它与tilesets有关,但我不知道是什么。