在Libgdx中使用json文件中的值

时间:2016-01-31 12:25:46

标签: android json libgdx

我想使用json文件中的值

这是Json文件

{
  "button" : [
    {
      "x" : 50.0
    },
    {
      "x" : 150.0
    }
]
}

我有以下课程

(按钮类)

public class Button extends Sprite{

    float x;

    public Button() {
        super(new Texture("button.png"));
    }

    @Override
    public void setX(float x) {
        this.x = x;
    }

}

(数据类)

public class Data {

    public Array<Button> buttons;

    public void load() {
        buttons = new Array<Button>();

        Json json = new Json();
        json.setTypeName(null);
        json.setUsePrototypes(false);
        json.setIgnoreUnknownFields(true);
        json.setOutputType(JsonWriter.OutputType.json);
        json.fromJson(Data.class, Gdx.files.internal("buttons.json"));

    }
}

(主类)

public class GameMain extends ApplicationAdapter {

    SpriteBatch batch;
    Data data;

    @Override
    public void create () {
        batch = new SpriteBatch();

        data = new Data();
        data.load();

        for(Button b : data.buttons) {
            b.setX(b.x);
        }

    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(0, 0, 0, 1f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batch.begin();
        for(Button b : data.buttons) {
            b.draw(batch);
        }
        batch.end();
    }
}

我想在json文件中保存特定x位置的按钮 但它什么都没给我。

我的代码有什么问题?

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在load()结束时,您没有将结果设置为对齐。只需添加按钮=:

public void load() {
    //instead of this line:
    //buttons = new Array<Button>();

    Json json = new Json();
    json.setTypeName(null);
    json.setUsePrototypes(false);
    json.setIgnoreUnknownFields(true);
    json.setOutputType(JsonWriter.OutputType.json);
    // set buttons here:
    buttons = json.fromJson(Data.class, Gdx.files.internal("buttons.json"));

}

答案 1 :(得分:1)

您的Data类加载Data类的另一个实例,但不会将其分配给任何内容。这是循环的,没有意义。 load方法应该是静态的,返回一个Data对象(这是当前load方法提供的最后一行),而不是尝试实例化一个空的buttons数组未使用。

您的按钮类隐藏了超类的x字段和setX方法,因此无法更改绘制时使用的精灵的实际X位置。 Sprite已经有x参数,因此您不应该添加自己的参数。如果您只是从Button类中删除这两件事,它应该可以工作。

那就是说,你不应该为每个按钮加载相同纹理的另一个副本。这是浪费内存和纹理交换。除非你非常小心处理这些精灵“拥有”的纹理,否则你也会泄漏记忆。