2017-07-07 39 views
0

我正在用levels.I工作在無盡的運行遊戲。我想爲第一級設置障礙。我想用json來做,但因爲我嘗試json首次解析。以正確的方式將json數據映射到java對象 - LibGdx

我創建了一個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 screens.For每個屏幕,我想作爲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; 
         } 
       } 
} 

} 

但我真的得到了如何解析這些東西與每個屏幕和障礙映射到屏幕和對象類很難created.Fully困惑,因爲我第一次使用json。

如果有人提出一些想法繼續,這將是非常有益的。

在此先感謝。

回答

0

有很多不同的方法來實現這一點。也許使用java集合對libgdx json進行一些研究。你如何最終構建你的代碼真的取決於你。我們不知道您的代碼的細節或您需要如何使用這些數據。

也許開始更簡單,找點事情,然後從那裏擴展一旦你更舒服。也許可以將每個屏幕上的json障礙分解爲單個文件來啓動。你留下的東西可以(只是一個例子)利用List接口。

同樣,作爲一個例子,如果你有一個障礙類(所有的代碼只是提供信息,甚至不知道它是否編譯)

pulic class Obstacle { 

    private String name; 
    private String position; 
    private int distance; 
    private int speed; 
} 

使用該實例化一個對象在一個級別每個障礙。那麼無論你做你的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)); 

這將使你的障礙,一個ArrayList中發揮了特定水平,但你如何使用它是你的。就像我上面所說的,有許多不同的選擇,但是你必須根據你的要求量身定製。例如,使用Map界面可能會更有意義,例如,將障礙物名稱用作關鍵字(或者可能不是 - 取決於您)。讓所有屏幕一次加載的所有障礙物可以列入清單列表(或地圖列表等)。更復雜的是,如果你得到了上述的工作,那麼你可以隨着日益複雜和重構來適應你的需求。

再一次,只是將上面的代碼輸入我的頭頂,所以語法可能有點偏離。經過一番您的意見

更新:

編輯補充正如我上面所說的,有很多種方法去了解它,這完全取決於你的數據,你要如何使用它。集合框架應該爲你提供所有你需要的,並且使用我爲json提供的例子,你應該能夠從文件中解析。 json越「複雜」,越複雜。因此,爲什麼我建議開始慢一點,或者將屏障障礙打入每個班級。

如果您已經爲障礙物創建了類,那麼原始答案中的json會自動將它讀入ArrayList中。每個障礙列表中的一個元素。

(同樣,所有這些代碼了我的頭頂部,可能有語法錯誤)

另一個選擇可能是使用地圖界面,也許一個HashMap。使用「名稱」作爲鍵,該值將成爲障礙物對象(不需要在對象中包含名稱)。像

Map<Obstacle> obstacles = new HashMap<String, Obstacle>(). 

現在有所收穫個人障礙,您可以訪問地圖,詢問名字的障礙,你會得到你的障礙類(在集合框架API讀了)。

你當然可以將你的障礙物嵌入另一個代表你的屏幕的集合。像

List<HashMap<String, Obstacle>> screenObstacles = new .... 

東西,所以,如果你在一個時間(如在我原來的例子)爲變量阿瓦爾讀你的JSON障礙一個屏幕,你應該能夠做到按需

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 
} 
+0

謝謝您的回答!我現在面臨的問題是screens.I要推廣代碼,這樣它應該自動拍攝畫面號爲每個level.Now我在一個不正確的與每個屏幕只是想爲什麼我應該使用ArrayList?如果你稍微詳細說明了答案,這將非常有幫助。我在我的問題中編輯了代碼。 – Niranjana

+0

您發佈的代碼具有硬編碼障礙變量,用於閱讀json的重複代碼並且不容易擴展(如果添加新障礙,該怎麼辦?)。所以通過推廣你的代碼來確定你的意思。不確定我是否能夠獲得更多的幫助,因爲真的不知道你想要做的每件小事。我發佈的例子展示瞭如何快速讀取屏幕的json值。所以推斷,並且當你有一個新的屏幕時讀取每個json,或者遍歷所有sreens的json一次,並在我的例子中創建一個列表的列表。 –

+0

感謝您的回覆!實際上我嘗試了一些我自己的東西,但沒有關於json及其用法的正確知識。現在我做了一些研究,我想按照您的示例進行操作,因爲我認爲它是正確的方式。 – Niranjana