2015-12-22 66 views
1

我在執行libgdx的默認用戶界面皮膚時遇到了問題。當我試圖加載uiskin.json作爲紋理地圖集時,在嘗試解析包括default.fnt的行時,我會在討論NumberFormatException時引發錯誤。libgdx - 解析default.fnt時讀取uiskin.json,NumberFormatException出錯

這是我的堆棧跟蹤與錯誤。

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: com.badlogic.gdx.utils.GdxRuntimeException: Error reading pack file: uiskin.json 
    at com.badlogic.gdx.assets.AssetManager.handleTaskError(AssetManager.java:560) 
    at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:365) 
    at com.dizydev.robotwars.screens.LoadScreen.update(LoadScreen.java:64) 
    at com.dizydev.robotwars.screens.AbstractScreen.render(AbstractScreen.java:55) 
    at com.dizydev.robotwars.RobotWars.render(RobotWars.java:41) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120) 
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Error reading pack file: uiskin.json 
    at com.badlogic.gdx.graphics.g2d.TextureAtlas$TextureAtlasData.<init>(TextureAtlas.java:187) 
    at com.badlogic.gdx.assets.loaders.TextureAtlasLoader.getDependencies(TextureAtlasLoader.java:58) 
    at com.badlogic.gdx.assets.loaders.TextureAtlasLoader.getDependencies(TextureAtlasLoader.java:34) 
    at com.badlogic.gdx.assets.AssetLoadingTask.handleSyncLoader(AssetLoadingTask.java:99) 
    at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java:88) 
    at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java:488) 
    at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:363) 
    ... 5 more 
Caused by: java.lang.NumberFormatException: For input string: "{ default-font: { file: default.fnt } }" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at com.badlogic.gdx.graphics.g2d.TextureAtlas$TextureAtlasData.<init>(TextureAtlas.java:116) 
    ... 11 more 

這是我用來加載默認用戶界面皮膚的代碼。

game.manager.load("uiskin.json", TextureAtlas.class); 
skin = new Skin(game.manager.get("uiskin.json", TextureAtlas.class)); 

我擁有所有必需的文件在我的文件夾assets,這裏是文件的列表。它們全部位於默認的assets文件夾中。

default.fnt 
default.png 
uiskin.atlas 
uiskin.json 
uiskin.png 

因爲它看起來像錯誤是uiskin.json文件的解析中,這裏是uiskin.json文件,我有一個副本。

{ 
com.badlogic.gdx.graphics.g2d.BitmapFont: { default-font: { file: default.fnt } }, 
com.badlogic.gdx.graphics.Color: { 
    green: { a: 1, b: 0, g: 1, r: 0 }, 
    white: { a: 1, b: 1, g: 1, r: 1 }, 
    red: { a: 1, b: 0, g: 0, r: 1 }, 
    black: { a: 1, b: 0, g: 0, r: 0 }, 
}, 
com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { 
    dialogDim: { name: white, color: { r: 0, g: 0, b: 0, a: 0.45 } }, 
}, 
com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: { 
    default: { down: default-round-down, up: default-round }, 
    toggle: { down: default-round-down, checked: default-round-down, up: default-round } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { 
    default: { down: default-round-down, up: default-round, font: default-font, fontColor: white }, 
    toggle: { down: default-round-down, up: default-round, checked: default-round-down, font: default-font, fontColor: white, downFontColor: red } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: { 
    default: { vScroll: default-scroll, hScrollKnob: default-round-large, background: default-rect, hScroll: default-scroll, vScrollKnob: default-round-large } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: { 
    default: { 
     font: default-font, fontColor: white, background: default-select, 
     scrollStyle: default, 
     listStyle: { font: default-font, selection: default-select-selection } 
    } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: { 
    default-vertical: { handle: default-splitpane-vertical }, 
    default-horizontal: { handle: default-splitpane } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: { 
    default: { titleFont: default-font, background: default-window, titleFontColor: white }, 
    dialog: { titleFont: default-font, background: default-window, titleFontColor: white, stageBackground: dialogDim } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle: { 
    default-horizontal: { background: default-slider, knob: default-slider-knob }, 
    default-vertical: { background: default-slider, knob: default-round-large } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { 
    default-horizontal: { background: default-slider, knob: default-slider-knob }, 
    default-vertical: { background: default-slider, knob: default-round-large } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: { 
    default: { font: default-font, fontColor: white } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { 
    default: { selection: selection, background: textfield, font: default-font, fontColor: white, cursor: cursor } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { 
    default: { checkboxOn: check-on, checkboxOff: check-off, font: default-font, fontColor: white } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: { 
    default: { fontColorUnselected: white, selection: selection, fontColorSelected: white, font: default-font } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: { 
    default: { background: default-pane, knob: default-round-large } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.Tree$TreeStyle: { 
    default: { minus: tree-minus, plus: tree-plus, selection: default-select-selection } 
}, 
com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { 
    default: { 
     label: { font: default-font, fontColor: white }, 
     background: default-pane, wrapWidth: 150 
    } 
}, 
} 

有沒有人知道我爲什麼得到這個錯誤?這對我來說並不直觀,而且我不確定它是否是解析錯誤或其他內容,因爲默認用戶界面外觀所需的所有文件都是可用的最新版本。如果有人能幫助我,那將不勝感激。

編輯:

給我的第一個答案並沒有解決我的問題。以下是我爲嘗試第一個解決方案所做的代碼更改。

game.manager.load("uiskin.png", TextureAtlas.class); 
skin = new Skin(Gdx.files.internal("uiskin.json"), game.manager.get("uiskin.png", TextureAtlas.class)); 

這裏是它提供給我的錯誤堆棧跟蹤。

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: com.badlogic.gdx.utils.GdxRuntimeException: Error reading pack file: uiskin.png 
    at com.badlogic.gdx.assets.AssetManager.handleTaskError(AssetManager.java:560) 
    at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:365) 
    at com.dizydev.robotwars.screens.LoadScreen.update(LoadScreen.java:64) 
    at com.dizydev.robotwars.screens.AbstractScreen.render(AbstractScreen.java:55) 
    at com.dizydev.robotwars.RobotWars.render(RobotWars.java:41) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120) 
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Error reading pack file: uiskin.png 
    at com.badlogic.gdx.graphics.g2d.TextureAtlas$TextureAtlasData.<init>(TextureAtlas.java:187) 
    at com.badlogic.gdx.assets.loaders.TextureAtlasLoader.getDependencies(TextureAtlasLoader.java:58) 
    at com.badlogic.gdx.assets.loaders.TextureAtlasLoader.getDependencies(TextureAtlasLoader.java:34) 
    at com.badlogic.gdx.assets.AssetLoadingTask.handleSyncLoader(AssetLoadingTask.java:99) 
    at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java:88) 
    at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java:488) 
    at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:363) 
    ... 5 more 
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Invalid line: 
    at com.badlogic.gdx.graphics.g2d.TextureAtlas.readTuple(TextureAtlas.java:443) 
    at com.badlogic.gdx.graphics.g2d.TextureAtlas$TextureAtlasData.<init>(TextureAtlas.java:115) 
    ... 11 more 

編輯:

從下面我能找出我的問題的幫助。我不得不從uiskin.json文件中刪除一個設置,因爲它沒有被正確解析。

我不得不改變這一點。

com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { 
    default: { 
     label: { font: default-font, fontColor: white }, 
     background: default-pane, wrapWidth: 150 
    } 
}, 

對此。

com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { 
    default: { 
     label: { font: default-font, fontColor: white }, 
     background: default-pane 
    } 
}, 

而我的新代碼看起來像這樣。

game.manager.load("uiskin.json", Skin.class); 
skin = game.manager.get("uiskin.json", Skin.class); 

回答

1

的libgdx引擎是開放的,你可以看看源的github所以它通常是好主意,have a look at place of your error。正如你看到的問題是行

116. width = Integer.parseInt(tuple[0]);  // <- this especially 
    117. height = Integer.parseInt(tuple[1]); 

我們現在知道的是,該錯誤與創建TextureAtlas實例有關。

看看你把你的textureAtlas加載到AssetManager中的方式(因爲我猜想game.manager是AssetManager)。您應該使用的

game.manager.load("uiskin.atlas", TextureAtlas.class); 

代替

game.manager.load("uiskin.json", TextureAtlas.class); 

的以.json文件不厚道圖譜定義的您需要創建TextureAtlas實例。阿特拉斯定義包含圖集的圖像位置和大小。

然後,將具有加載TextureAtlas,你應該使用Skin的構造器

Skin(FileHandle skinFile, TextureAtlas atlas) 

skin = new Skin(Gdx.files.internal("uiskin.json"), game.manager.get("uiskin.png", TextureAtlas.class)); 

要爲皮膚提供JSON定義,然後的TextureAtlas它。

這是你應該這樣做的方式。

+0

您的解決方案不起作用。我對我的帖子進行了編輯,以擴展它給我的錯誤,希望能夠提供更多的說明。 –

+0

對不起,我做了一個薄霧 - TextureAtlas需要.atlas文件 - 檢查我的編輯 –

+0

謝謝,你的文章實際上幫助我解決了我的問題。我上面做了一個編輯來解釋這個修復,它和你的修改是一樣的,但它需要另外的調整。 –