Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以正确的方式将json数据映射到java对象LibGdx_Libgdx - Fatal编程技术网

以正确的方式将json数据映射到java对象LibGdx

以正确的方式将json数据映射到java对象LibGdx,libgdx,Libgdx,我正在做一个有关卡的无休止的跑步游戏。我想在第一关卡设置障碍。我想用json来做,但是有困难,因为我第一次尝试json解析 我创建了一个json文件,如下所示: { "screen1": [ {"name":"rock","position":"middle","distance":"400","speed":"0"} ], "screen2": [ {"name":"snake","position":"up","distance":"100","speed":"0"},

我正在做一个有关卡的无休止的跑步游戏。我想在第一关卡设置障碍。我想用json来做,但是有困难,因为我第一次尝试json解析

我创建了一个json文件,如下所示:

{
"screen1":
[
{"name":"rock","position":"middle","distance":"400","speed":"0"}
],
"screen2":  
[
      {"name":"snake","position":"up","distance":"100","speed":"0"},
      {"name":"watersnake","position":"up","distance":"800","speed":"0"}
],
"screen3":
 [
      {"name":"rock","position":"middle","distance":"400","speed":"0"},
      {"name":"gorilla","position":"middle","distance":"500","speed ":"0"},
      {"name":"crow","position":"up","distance":"200","speed":"0"}

],

"screen4":
[
    {"name":"crocodile","position":"up","distance":"600","speed":"0"},
    {"name":"gap","position":"up","distance":"700","speed":"0"},
    {"name":"cloud","position":"up","distance":"300","speed":"0"}

],
"screen5":
[
{"name":"gorilla","position":"middle","distance":"500","speed ":"0"}
]
}
实际上,我将整个移动背景划分为5个屏幕。对于每个屏幕,我希望按照json文件中的指定放置障碍物

为此,我想将解析后的json映射到java对象

所以我创建了一个类似这样的方法来进行解析:

 public void loadLevelJson(String fileName,String entryName)
{
        JsonValue jsonValue = new JsonReader().parse(Gdx.files.internal(fileName));
        JsonValue objList = jsonValue.get(entryName);
            //  System.out.println("name:" + objList);
                if (entryName.equals("screen2")){
                    System.out.println("____________"+entryName);
                for(JsonValue value : objList.iterator())
                {
                      if(value.getString("name").equals("rock"))
                      {
                          rockSpeed=value.getFloat("speed");
                          rockpos=value.getString("position");
                          rockX=value.getFloat("distance");

                          if(value.getString("position").equals("middle"))
                              rockY=Constants.BIG_ROCK_Y;
                      }

                      if(value.getString("name").equals("snake"))
                      {
                          snakeSpeed=value.getFloat("speed");
                          snakePos=value.getString("position");
                          snakeX=value.getFloat("distance");
                          if(value.getString("position").equals("up"))
                              snakeY=Constants.SNAKE_Y;
                      }
                      if(value.getString("name").equals("watersnake"))
                      {
                          w_snakeSpeed=value.getFloat("speed");
                          w_snakePos=value.getString("position");
                          w_snakeX=value.getFloat("distance");
                          if(value.getString("position").equals("down"))
                              w_snakeY=Constants.W_SNAKE_Y;
                      }
                      if(value.getString("name").equals("gorilla"))
                      {
                          gorillaSpeed=value.getFloat("speed");
                          gorillaPos=value.getString("position");
                          gorillaX=value.getFloat("distance");
                          if(value.getString("position").equals("middle"))
                              gorillaY=Constants.GORILLA_Y;
                      }
                      if(value.getString("name").equals("crow"))
                      {
                          crowSpeed=value.getFloat("speed");
                          crowPos=value.getString("position");
                          crowX=value.getFloat("distance");
                          if(value.getString("position").equals("up"))
                              crowY=Constants.CROW_Y;
                      }

                      if(value.getString("name").equals("gap"))
                      {
                          gapSpeed=value.getFloat("speed");
                          gapPos=value.getString("position");
                          gapX=value.getFloat("distance");
                          if(value.getString("position").equals("down"))
                              gapY=Constants.GAP_Y;
                      }
                      if(value.getString("name").equals("cloud"))
                      {
                          cloudSpeed=value.getFloat("speed");
                          cloudPos=value.getString("position");
                          cloudX=value.getFloat("distance");
                          if(value.getString("position").equals("up"))
                              cloudY=Constants.CLOUD_Y;
                      }
                      if(value.getString("name").equals("cloud"))
                      {
                          crocodileSpeed=value.getFloat("speed");
                          crocodilePos=value.getString("position");
                          crocodileX=value.getFloat("distance");
                          if(value.getString("position").equals("down"))
                              crocodileY=Constants.CROCODILE_Y;
                      }
                }
}

}
但是我真的很难在每个屏幕上解析这些东西,并且在映射到屏幕和创建的对象类时遇到了障碍。完全困惑,因为我是第一次使用json

如果有人提出一些继续进行的想法,这将非常有帮助


提前感谢。

实现这一点有很多不同的方法。也许可以使用java集合对libgdxJSON进行一些研究。最终如何构建代码实际上取决于您。我们不知道您的代码的详细信息,也不知道您需要如何使用数据

也许从简单的开始,做一些工作,然后在你感到更舒服的时候从那里开始扩展。也许可以在每个屏幕上将json障碍分解成单独的文件来开始。然后剩下的(只是一个示例)可以利用列表界面

同样,作为一个例子,如果您有一个障碍类(所有代码都只是信息性的,甚至不知道它是否编译)

使用此选项为关卡中的每个障碍物实例化一个对象。然后,无论您在哪里进行json解析/需要障碍,都可以

...
//fileName contains only obstacles for one screen, not all of them
ArrayList<Obstacle> obstacles = json.fromJson(ArrayList.class, Obstacle.class, Gdx.files.internal(fileName));
Map<Obstacle> obstacles = new HashMap<String, Obstacle>(). 
然后根据需要检索

Map<Obstacle> obstacles = screenObstacles.get(screenNumber); //screenNumber is screen you are on, ex 0/1/2/...
Obstacle obstacle = obstacles.get(GORILLA_NAME); // GORILLA_NAME is a string "gorilla"

//or loop through all obstacles for a given screen and do something with them

for (Obstacle obstacle : obstacles) {
    //something amazing goes here
}
地图障碍=屏幕障碍。获取(屏幕编号)//screenNumber是您所在的屏幕,例如0/1/2/。。。
障碍物=障碍物。获取(大猩猩名称);//GORILLA_名称是字符串“GORILLA”
//或者在给定屏幕的所有障碍物中循环,并对其进行处理
用于(障碍物:障碍物){
//这里发生了一些惊人的事情
}

谢谢您的回答!我现在面临的问题是屏幕。我必须对代码进行概括,使其能够自动获取每个级别的屏幕编号。现在我只是以一种不正确的方式尝试每个屏幕。为此,我应该使用ArrayList吗?如果你详细说明一下答案,这将非常有帮助。我在问题中编辑了代码。你发布的代码很难理解编码的障碍变量、用于读取json的重复代码不容易扩展(如果添加新障碍会怎么样?)。所以不确定泛化代码是什么意思。不确定我是否能提供更多帮助,因为我真的不知道你想做的每一件小事。我发布的示例展示了如何快速读取屏幕上的json。因此,在我的示例中,如果你有一个新屏幕,那么你可以推断一下,或者阅读每个json,或者循环一次你所有的SREEN的json,并创建一个列表。谢谢你的回复!实际上,我是在尝试我自己的东西,对json及其用法没有适当的了解。现在我做了一些研究,我想按照你的例子,因为我觉得这是正确的方式。我已经用你在例子中提到的相同属性分别为障碍物创建了类。比如rock,crow,鳄鱼等。现在我对如何为这些障碍创建arrayList感到困惑。我确实用了更多的建议更新了我的答案。更多的“理论”,还有一些代码片段来说明我的意思。需要理解集合,甚至在更高的层次上理解一些API。但是如果你看的话,有很多很好的文档/例子。
List<HashMap<String, Obstacle>> screenObstacles = new ....  
screenObstacles.add(aVar);
Map<Obstacle> obstacles = screenObstacles.get(screenNumber); //screenNumber is screen you are on, ex 0/1/2/...
Obstacle obstacle = obstacles.get(GORILLA_NAME); // GORILLA_NAME is a string "gorilla"

//or loop through all obstacles for a given screen and do something with them

for (Obstacle obstacle : obstacles) {
    //something amazing goes here
}