cocos2d-xのspine Jsonをint対応にする

cocos2d-xの標準JSONパーサーといえば spine Jsonだけど、spine Jsonでは、数値データはすべてfloatで扱われる。

現在製作中のアプリではデータをJSON形式で保存しているのだけど、日時のデータをJSON形式でファイルに保存し、次に読み込むと、どうも日時がずれていることに気がついた。
日時のデータは time_t 形式の値で、JSON上ではintとして扱っている。
ところが、一旦保存して次にこれを読み込む際には、spine Jsonはこの値をfloat値としてパースする。
調べてみたところ、このとき僅かではあるが、JSON文字列に記述された値とfloatにパースされた値との間に誤差が生じていることが分かった。

float計算には誤差がつきものと言うが、どうやら、大きな整数値をfloat計算でパースしようとすると、この誤差が無視できなくなってしまうようだ。

そこで、整数値は整数値としてパースするように spine Json を修正することにした。
まずは、spineのJson.hのstruct Jsonに、値が整数値かfloat値かを示すフラグ変数を新たに追加する。

整数値かfloat値かを示すフラグ変数を導入する代わりに、 Json_NumberをJson_IntとJson_Floatに分けるやりかたもあるかと思うが、このやり方のほうが他のコードへの影響が小さくて良いのではないかと思う。

次に、Json.cppの static const char* parse_number (Json *item, const char* num) を次のように修正する。

これであとは、たとえばこんなふうに使えばいい。


コメントを残す