在尝试实现我的Tilemap时,Java给我一个错误'对于输入字符串:"" '

时间:2014-12-26 21:56:04

标签: java slick2d

现在我正面临一个问题,我似乎无法在互联网上找到任何帮助。我正在尝试将我用Tiled制作的tilemap实现到我的Slick2D java项目中,但是我无法解决这个错误代码:

ERROR:For input string: ""
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at org.newdawn.slick.tiled.TiledMap$ObjectGroup.<init>(TiledMap.java:1008)
at org.newdawn.slick.tiled.TiledMap.load(TiledMap.java:688)
at org.newdawn.slick.tiled.TiledMap.<init>(TiledMap.java:106)
at org.newdawn.slick.tiled.TiledMap.<init>(TiledMap.java:90)
at simpleslickgame.SpielTest.init(SpielTest.java:36)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
at simpleslickgame.SpielTest.main(SpielTest.java:25)

Fri Dec 26 22:47:27 CET 2014 ERROR:Failed to parse tilemap
org.newdawn.slick.SlickException: Failed to parse tilemap
at org.newdawn.slick.tiled.TiledMap.load(TiledMap.java:695)
at org.newdawn.slick.tiled.TiledMap.<init>(TiledMap.java:106)
at org.newdawn.slick.tiled.TiledMap.<init>(TiledMap.java:90)
at simpleslickgame.SpielTest.init(SpielTest.java:36)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
at simpleslickgame.SpielTest.main(SpielTest.java:25)
Caused by: java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at org.newdawn.slick.tiled.TiledMap$ObjectGroup.<init>(TiledMap.java:1008)
at org.newdawn.slick.tiled.TiledMap.load(TiledMap.java:688)
... 6 more

我无法找到解决这个问题的方法。我没有处理任何可能最终输入字符串的输入。我无法弄清楚我做错了什么。

这是我的代码:

package simpleslickgame;

import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.tiled.TiledMap;

public class SpielTest extends BasicGame
{
public TiledMap map;

public SpielTest()
{
    super("Test");
}

public static void main(String[] arguments)
{
    try
    {
        AppGameContainer app = new AppGameContainer(new SpielTest());
        app.setDisplayMode(1000, 800, false);
        app.start();
    }
    catch (SlickException e)
    {
        e.printStackTrace();
    }
}

@Override
public void init(GameContainer container) throws SlickException
{
    map=new TiledMap("res/Slickesdingbruder.tmx");
}

@Override
public void update(GameContainer container, int delta) throws SlickException
{
}

public void render(GameContainer container, Graphics g) throws SlickException
{
    map.render(0, 0);
}
}

将问题指向某个地方可能会有所帮助,但我无法在代码和错误之间找到连接。

2 个答案:

答案 0 :(得分:1)

对于未损坏的文件存在同样的问题,请检查Slick2D源。此错误是由于尝试加载具有“width”和“height”属性未定义或不可解析的对象层的映射而导致的,因为其“objectgroup”XML标记中的Integers(.tmx文件是XML)。 Tiled的Java库的Slick2D版本需要它们(据我所知它不会使用它们 - 我的版本完全忽略了它的渲染代码中的地图对象)并且Tiled地图编辑器通常不会(如果有的话)定义它们 - 如果你真的需要一个对象层的边界框,它最好在加载地图后计算。

希望这最终会得到修复,但最简单的解决方法是在文本编辑器中打开.tmx文件,并在每个objectgroup标记中插入width="1" height="1"。这可以通过首先将.tmx文件加载到String中,执行find()或正则表达式搜索并替换并使用“TiledMap”调用new ByteArrayInputStream(tmxString. getBytes(Charset.forName("UTF-8"))构造函数来实现自动化。

答案 1 :(得分:0)

@Dana Otken,.tmx文件中的width =“1”height =“1”是必要的,但我注意到了另一个因素。如果您确实使用Tiled,则必须确保每个对象层中的每个对象都具有以下值的整数:宽度,高度,X位置和Y位置。原因如下:int数据类型无法处理小数。您可能还记得,这就是双数据类型的用途。当光滑(或lwjgl,我不记得哪个)尝试使用带有字符串输入的parseInt方法时,它会抛出此错误,并且无法运行。记住:Int不能保存十进制值,并且您正在使用parseInt方法。

P.S。你不能拥有像素的一小部分,所以即使你确实有一个带有实际小数的double值,它也没有意义,因为像素不能进一步划分。

希望这有帮助!

此处有类似的SO页面:https://gamedev.stackexchange.com/questions/93607/how-import-and-draw-a-tiledmap-with-slick2d/122051#122051