2016-12-13 4 views
1

私はJSONの基本を理解していますが、もっと興味があるのは、これを使って私が何をする必要があるのか​​を理解する方法です。 ゲームアイテムを格納するLibgdx

は、私はそれが「WHATEVER OF WEAPON」の項目名を保持しますので、その統計情報を持っているJSONファイル内のすべての私のゲームのアイテムを保存したい、私に説明してみましょうなどなど buyPricesellPriceminDamagemaxDamage、など...

JSONでこれを行うにはどうすればいいですか?

答えて

2

です私のゲームの参照データを格納するJSONファイルです。良いニュースはlibGDX comes with a JSON parserです。このコードは、次のようにコードのいくつかの行で使用できます。

public class Item { 
    private String name; 
    private String description; 
    private String image; 
    private float baseValue; 
    private int baseQuantity; 
    private float rarityIndex; 
    private Array<String> tags = new Array<>(); 

    public Item() { } 
    // More Constructors/Getters/Setters/Helper Methods, etc. 
} 

は、その後、あなたがファイルを読むためJsonオブジェクトを作成する必要があります(またはファイルへの書き込み):まず、あなたがシリアライズ可能なクラスを定義したい。これは、実際にある

Json json = new Json(); 
types = json.fromJson(Array.class, Item.class, Gdx.files.internal(FILE_NAME)); 

私のゲームの作業コード。いくつかのことは指摘します

  • 種類はlibGDXのArrayクラスを使用したタイプArray<Item>です。つまり、libGDXに適切な配列ではなくArrayオブジェクトとして解釈するように指示していますが、libGDXのデータ構造が本当に好きなので、これは私にとって問題ではありません。
  • GWTを使用する場合、特に マップを使用している場合、com.badlogic.gdx.utilsのlibGDX実装を使用する場合は、すべてのJavaデータ構造がサポートされているわけではありません。これは、GWTの本質は反射に一定の制限を課しているからです。
  • 我々はJson#fromJson()を呼び出すときに我々はそれがArray<Item>オブジェクトを返すために知っているようにArray.classItem.classを渡す必要があることに注意してください。

ここでJSONをどのように構成しますか?これを理解する最も簡単な方法は、いくつかのオブジェクトを生成し、ファイルまたは標準出力に書き込む小さなテストプログラムを作成することです:

System.out.println(json.prettyPrint(types)); 

これは、単純な構造のために働く(そしておそらくあなたが必要とするすべてであるだろう。が、それはJSONを見て、それが構造化されます方法を理解するために役に立つかもしれません、以前の私の例に戻って、JSONファイルは、次のようになります。

[ 
    { 
    "class": "tech.otter.merchant.data.Item", 
    "name": "Bindookian Spices", 
    "description": "Sweet, yet spicy.", 
    "image": "goods0", 
    "baseValue": 150, 
    "baseQuantity": 1000, 
    "rarityIndex": 0.25, 
    "tags": [ 
     "category-food", 
     "category-luxury" 
    ] 
    }, 
    { 
    "class": "tech.otter.merchant.data.Item", 
    "name": "Italiluminum Rods", 
    "description": "Shiny.", 
    "image": "goods1", 
    "baseValue": 400, 
    "baseQuantity": 1000, 
    "rarityIndex": 0.25, 
    "tags": [ 
     "category-valuable", 
     "category-material" 
    ] 
    } 
    // More items in the real file 
] 

あなたは、これは非常に簡単マッピングであることがわかりますJSONから私たちのクラスまでいくつかの注意点:

  • ファイルが角括弧[]で始まるところに注意してください。これは、コード内のArrayクラスに変換していても、データがJSON配列として保存されていることを示しています。
  • これはlibGDXの出力を基にしているため、各Item構造の内部には「class」タグがあります。私はこれが厳密に必要であるとは考えていませんが、このようなネストされたデータ構造を持っているときに傷つくことはありません。
  • 「タグ」が配列としてどのように格納され、libGDXがArrayオブジェクトであるかを知る必要はありません。要約すると

、libGDXライブラリは、(あなたは特別なシリアル化のニーズを持っている場合further customizedすることができます)、独自のJSONパーサが付属していますが、トレードオフは、あなたが特にとき(特定のケースでlibGDXデータ構造を使用しなければならないことですGWTを使用して)。

+0

本当に助けてくれてありがとう、ありがとう! 1つの質問、あなたは特定のアイテムを取得したいと思う、あなたはちょうどjsonをロードし、あなたが名前でほしいアイテムを呼ぶでしょうか? – johnnyboy5566

+0

ファイルが非常に大きい場合を除き、最も簡単な方法は、配列を読み込んだ後、その配列を検索して、必要な項目を探し出すことです。私の使用例では、すべてをロードしてメモリに格納したかったのです。パフォーマンスが問題になる場合は、「イベントベースの解析」(libGDX wikiページで参照)を使用して何らかのクエリを作成することができると思います。 – John

0

私はGsonを使って同様のことを達成しています。

最初

compile group: 'com.google.code.gson', name: 'gson', version: '2.6.2' 

build.gradle(あなたの択一のプロジェクトの)あなたの心にこれを追加設定(ユーザーデータを保存するlibgdxのクロスplaformの道)を取得または割り当てる:

//It is advised to use you app package name + some name for these specific prefs to avoid collision with other apps using the same name. Since some plaform uses this name for a flat file name. 
Preferences preferences = Gdx.app.getPreferences("nl.example.whatever"); 

ロード/あなたの値を保存:

Gson gson = new Gson(); 

Item getItem(String id) 
{ 
    String data = preferences.getString(id,null); 
    if(data == null) 
     return null; 

    Item item = gson.fromJson(preferences.getString(id),Item.class); 
} 

void saveItems(List<Item> items) 
{ 
    for(Item item : items) 
    { 
     preferences.putString(item.getId(),gson.toJson(item)); 
    } 
    //save from cache to file. Try to minimize flush calls. 
    preferences.flush(); 
} 

LibGDX wiki on preferences

これは、あなたのデータが説明だけでなく、動的であることを示しています。その場合、私は(私は一度の成果のためにそれを作成した)次のことをお勧めします。

はbuild.gradleに追加:

compile 'org.json:json:20151123' 

Achievement.IDは、私が使用した列挙

void loadAchievements() 
{ 
    JSONArray array; 
    try 
    { 
     String json = Globals.loadResourceToString("achievements.json"); 
     array = new JSONArray(json); 
    } 
    catch (Exception ex) 
    { 
     throw new RuntimeException("could not load achievements"); 
    } 

    int nr_of_achievements = array.length(); 
    for (int i = 0; i < nr_of_achievements; i++) 
    { 
     JSONObject obj = array.getJSONObject(i); 
     if (obj.getString("id") == null) 
      throw new RuntimeException("achievement does not exist"); 
     Achievement.ID id = Achievement.ID.valueOf(obj.getString("id")); 
     achievementList.put(id, new Achievement(id, obj)); 
    } 
} 


public static String loadResourceToString(String resourceName) throws Exception 
{ 
    ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
    InputStream resourceStream = loader.getResourceAsStream(resourceName); 
    StringBuilder sb = new StringBuilder(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(resourceStream, "UTF-8")); 
    for (int c = br.read(); c != -1; c = br.read()) sb.append((char) c); 
    return sb.toString(); 
} 
+0

私は他の場所を使っているので、返信してくれても環境設定を使うのはおそらく最高の選択肢ではありません。ちょっとストレートな読み書きが必要ですが、100%確実な方法はありませんアイテムのサブプロパティを持ち、複数のアイテムを持つことでそれを行う – johnnyboy5566

関連する問題