2016-03-09 6 views
0

Я начал разрабатывать игру в Libgdx, и я начал работать над чем-то. Я получил background.png Я пытаюсь загрузить с моей кожи. Я пытаюсь загрузить gameskin.atlas в мой объект AssetManager, но каждый раз, когда я пытаюсь загрузить его, я получаю сообщение об ошибке:Ошибка загрузки файла libgdx

Caused by: com.badlogic.gdx.utils.SerializationException: Error parsing file: packs/gameskin.atlas 
    at com.badlogic.gdx.utils.JsonReader.parse(JsonReader.java:77) 
    at com.badlogic.gdx.utils.Json.fromJson(Json.java:692) 
    ... 14 more 
Caused by: com.badlogic.gdx.utils.SerializationException: Error parsing JSON on line 3 near: 
gameskin.png 
*ERROR*format: RGBA8888 
filter: Nearest,Nearest 
repeat: none 
footballpi 
    at com.badlogic.gdx.utils.JsonReader.parse(JsonReader.java:549) 
    at com.badlogic.gdx.utils.JsonReader.parse(JsonReader.java:55) 
    at com.badlogic.gdx.utils.JsonReader.parse(JsonReader.java:75) 
    ... 15 more 

Вот где я пытаюсь загрузить его:

package screens; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.scenes.scene2d.ui.Image; 
import com.badlogic.gdx.scenes.scene2d.ui.Skin; 

import engine.Values; 


public class GameScreen extends ScreenWrapper{ 

    private final String GAME_SKIN_PATH = "packs/gameskin.atlas"; 
    private ScreenRenderer renderer; 
    public GameScreen(ScreenManager manager) { 
     super(manager); 
    } 

    @Override 
    public void initiate() { 
     manager.getLoader().load(GAME_SKIN_PATH, Skin.class); 
    } 

    @Override 
    public void buildStage() { 
     Skin skin = manager.getLoader().getAsset(GAME_SKIN_PATH, Skin.class); 
    } 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(242/255f, 242/255f, 242/255f, 0); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     super.render(delta); 
    } 

    @Override 
    public void dispose() { 
     manager.getLoader().unload(GAME_SKIN_PATH); 
    } 

} 

Я попытался удалить параметр размера в файле gameskin.atlas, но это не проблема. В чем может быть проблема?

EDIT: Я попытался использовать AssetDescriptors и SkinParameter для решения этой проблемы. Теперь он выдает эту ошибку:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: com.badlogic.gdx.utils.GdxRuntimeException: Error reading pack file: packs/gameskin.atlas 
    at com.badlogic.gdx.assets.AssetManager.handleTaskError(AssetManager.java:570) 
    at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:375) 
    at com.badlogic.gdx.assets.AssetManager.finishLoading(AssetManager.java:396) 
    at engine.utils.AssetsLoader.load(AssetsLoader.java:41) 
    at screens.GameScreen.initiate(GameScreen.java:21) 
    at screens.ScreenManager.pushScreen(ScreenManager.java:21) 
    at engine.TapTapMain.create(TapTapMain.java:27) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:147) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124) 
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Error reading pack file: packs/gameskin.atlas 
    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:498) 
    at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:373) 
    ... 7 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) 
    ... 13 more 

Вот мой GameScreen Сейчас:

package screens; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.scenes.scene2d.ui.Image; 
import com.badlogic.gdx.scenes.scene2d.ui.Skin; 

import engine.Values; 
import engine.utils.AssetsLoader; 


public class GameScreen extends ScreenWrapper{ 

    private ScreenRenderer renderer; 
    // The constructor gets the ScreenManager to notify on screen transitions 
    public GameScreen(ScreenManager manager) { 
     super(manager); 
    } 

    @Override 
    public void initiate() { 
     manager.getLoader().load(AssetsLoader.SKIN_GAME); 
    } 

    @Override 
    public void buildStage() { 
     Skin skin = manager.getLoader().findAsset(AssetsLoader.SKIN_GAME); 
     Image backgroundPitch = new Image(skin.getDrawable("football_pitch")); 
     backgroundPitch.setSize(Values.WIDTH, Values.HEIGHT); 
     renderer.addActor(backgroundPitch); 
     addActor(renderer); 
    } 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(242/255f, 242/255f, 242/255f, 0); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     super.render(delta); 
    } 

    @Override 
    public void dispose() { 
     manager.getLoader().unload(Values.GAME_SKIN_PATH); 
    } 

} 

ответ

2

Вы пытаетесь загрузить Atlas в Skin. A Atlas - это файл, содержащий все упакованные данные изображения. A Skin содержит данные для использования с Scene2D элементами, такими как BitmapFont, LabelStyle и ButtonStyle.

Кожа нуждается как в json skin файл и атлас. Чтобы правильно загрузить его за один раз с помощью AssetManager, вам необходимо использовать SkinLoader.SkinParameter.

manager.load("skin.json", Skin.class, new SkinLoader.SkinParameter("image.atlas")); 

Кроме того, я предпочитаю использовать AssetDescriptors для поиска активов в менеджере. Они будут идти в своем классе менеджер:

//A atlas or texture do not require additional parameters. 
public static final AssetDescriptor<TextureAtlas> ATLAS = 
    new AssetDescriptor<TextureAtlas>("image.atlas", TextureAtlas.class); 

//A skin does require additional parameters. 
public static final AssetDescriptor<Skin> SKIN = 
    new AssetDescriptor<Skin>("skin.json", Skin.class, 
    new SkinLoader.SkinParameter("image.atlas")); 

Теперь загрузите их, когда/как вы хотите manager.load(skin). Когда вам нужен конкретный актив, вы можете посмотреть эти дескрипторы до статично в своем классе Assets и передать его своему менеджеру manager.find(Assets.SKIN). Во-первых, это создает хороший список всех ваших активов при вводе Assets., во-вторых, вам не нужно бросать или добавлять .class актива при его назначении с тех пор, как он уже находится в AssetDescriptor и, наконец, вам не нужна строка для поиска пути в менеджере, который подвержен ошибкам.

+0

Теперь он говорит «Недействительная линия». См. Обновленную запись. –

+0

@DuduLasry нет обновленного сообщения, только со вчерашнего дня. Факт остается, вы не можете хранить 'Атлас' в объекте' Skin' по той же причине, что вы не можете хранить 'String' в' Integer'. – Madmenyo

+0

Я обновил свой пост, не могли бы вы посмотреть на него? –

Смежные вопросы