2017-07-07 6 views
0

レベルで無限に実行されているゲームで作業しています。私は最初のレベルで障害を置いています。私はjsonでやりたいですが、 jsonの最初の解析。適切な方法でJavaオブジェクトへのjsonデータのマッピング-LibGdx

私はこのようなJSONファイル作成:実は私は5 screens.Forの背景に各画面を移動全体の分割

{ 
"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"} 
] 
} 

を、私は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の解析をやっているところはどこでも続い/障害物を必要とし、その特定のレベルのためにプレーしてあなたの障害物のArrayListのを与えるだろう

... 
//fileName contains only obstacles for one screen, not all of them 
ArrayList<Obstacle> obstacles = json.fromJson(ArrayList.class, Obstacle.class, Gdx.files.internal(fileName)); 

のようなものを持っていますが、あなたはどのように使用するか、それはあなた次第です。上記のように、さまざまなオプションがありますが、要件に合わせて調整する必要があります。マップインターフェイスを使用すると、たとえば、障害物の名前をキーとして使用する(またはあなたまで)ことができます。すべての画面のすべての障害を一度にロードすると、List of Lists(またはList of Mapなど)に表示される可能性があります。もっと複雑ですが、もしあなたが上記の作業をするならば、あなたのニーズに合うように複雑さとリファクタリングがますます増していくことができます。

もう一度、私の頭の上から上に入力したので、構文が少しずれている可能性があります。

編集を追加する:私は上記に述べたように、すべてのデータとどのようにあなたがそれを使用するに応じて、それについて移動するための多くの方法がある:あなたのコメントのいくつかの後に

更新。 Collections Frameworkは必要なものすべてを提供するはずです。私がjsonに提供した例を使用すると、ファイルから解析できるはずです。より多くの "入れ子"を持つほど、より複雑なjson。したがって、なぜ私は遅く始めることを提案するか、個々のクラスに画面の障害を壊すことを提案する。

障害物のクラスを作成していれば、元の答えのjsonが自動的にArrayListに読み込まれます。各障害物のリストの1つの要素。

(繰り返しますが、私の頭の上からすべてのコード、構文エラーを持つことができます)

別のオプションは、多分Mapインタフェース、HashMapを使用することであってもよいです。キーとして「名前」を使用すると、値は障害オブジェクトになります(オブジェクトに名前を含める必要はありません)。今

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

のようなものは、あなたが名前で障害物を求めて、マップにアクセスし、個々の障害物を得るために、あなたはあなたの障害物クラス(コレクションフレームワークのAPIをよく読んで)を取得します。

もちろん、画面を表す別のコレクションに障害物を入れ子にすることができます。

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

ような何かあなたが変数アヴァールに(私の元の例のように)時点で、あなたのJSONの障害1つの画面を読んであれば、あなたは必要に応じて取得後

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を読み込んだり、あなたのすべてのssonのjsonを一回ループしたりして、私の例ではリストのリストを作成してください。 –

+0

返事ありがとう!実際に私はjsonとその使い方についての適切な知識なしに私自身の何かを試していました。今私はいくつかの研究を行いました。 – Niranjana

関連する問題