Генерация файла JSON с вложенными массивами для загрузки игрового уровня

#arrays #json #libgdx

#массивы #json #libgdx

Вопрос:

Я хочу загрузить уровни из файла json для моей игры tower Defense.Я перепробовал множество веб-сайтов-генераторов json, но не смог получить именно то, что мне нужно.

Я хочу что-то вроде ;

— Уровень

—-Волна

——Враг (EnemyType,время появления)

Например: level[2].wave[3].enemy[1].EnemyType должен возвращать EnemyType.

Уровни состоят из волн, а волны состоят из врагов. У всех врагов есть две переменные: EnemyType и spawnTime.

Комментарии:

1. И в чем теперь ваш вопрос? Почему бы вам самому не написать JSON?

2. Используйте Json класс libgdx. Создайте структуру в коде, а затем просто выполните Json.toJSON(уровень, Level.class , файл);

3. Спасибо, никто, это действительно имеет смысл для сложных иерархий, это был бы лучший способ.

Ответ №1:

Это не сложная задача. Однако JSON не будет обрабатывать реализацию абстрактных классов / интерфейсов. Это означает,

 Enemy e = new Skeleton();
  

невозможно сериализовать с помощью JSON и затем прочитать. Вам нужно будет сделать обходной путь, например, сохранить строку имени класса, а затем загрузить ее с помощью чего-то вроде

 Class clazz = Class.forName("com.my.cool.package.enemy."   "Skeleton");
Enemy e = (Enemy) clazz
.getConstructor(Vector2.class, int.class)
.newInstance(new Vector2(0, 10), 5);
  

Хорошо, возвращаясь к основному вопросу, сделайте это следующим образом:

 class Enemy {
    String className;
    int spawnTime;
}

class Wave {
    Enemy[] enemies;
}

class Level {
    Wave[] waves;
}
  

затем создайте свой уровень:

 Level l = new Level();
l.waves = new Wave[1];
l.waves[0].enemies = new Enemies[1];

l.waves[0].enemies[0] = new Enemy();
l.waves[0].enemies[0].className = "Skeleton";
l.waves[0].enemies[0].spawnTime = 5;
  

не забудьте импортировать libgdx JSON (больше информации на wiki).

 Json json = new Json();
System.out.println(json.prettyPrint(l));
  

это должно вывести ваш уровень, просто используйте json.toJSON(l) для меньшего вывода. (Но не настолько красиво.) Чтобы загрузить его, используйте:

 Json json = new Json();
String text = json.prettyPrint(l);
Level level = json.fromJson(Level.class, text);