概要
プレイヤーや敵を作成する際に設定する座標や拡大率、HPの数値などを外部ファイル(今回はJson)を使って読み込む方法の備忘録です。
目次
- Jsonの特徴をざっくりと解説
- 読み込み
- まとめ
1.Jsonの特徴をざっくりと解説
Jsonは軽量とデータの読みやすさが特徴としてあげられます。
データはテキスト形式で記述され、キーと値のペアで表現されるので軽量でシンプルになります。
個人的な考え
個人的な考えとしては、キャラクターのパラメータを一々定数やで定義しなくていいし、プログラムをいじらずに調整可能だったり、データと処理を分けることができるので便利だと思っています。
プログラマー以外の方でもjsonのデータをいじるだけで調整可能なのもいいですね。
jsonの基本的な構造はこのようになっています。
{
"name":"Player", //名前
"old":20, //年齢
"item":["apple","banana"], //持ってるアイテム
"Hungry":true //お腹空いてるかどうか
}
{}で囲われている部分はオブジェクトを意味します。
キーには文字列、値は数値、文字列、真偽値などを扱うことができます。
データの区切りにはカンマ(,)を使用しましょう
ダブルクォーテーション(")やカンマ(,)などを忘れるとうまく読み込めないので忘れないようにしましょう。
参考記事
2.読み込み
Jsonを簡単に扱うために外部ライブラリを用意します。
[Git]https://github.com/nlohmann/json
今回はunordered_mapと列挙型を使って読み込んだjsonデータを使っていきます。
プレイヤーのJsonデータは以下のようになっています。
{
"Player": {
"Transform":
{
"position": [10, 0, 10],
"scale": 1.0
},
"Parameter":
{
"hp": 100,
"muteki":false
}
}
}
PlayerオブジェクトにはTransformとParameterというオブジェクトがあり、その中にキーと値のペアが入っています。
読み込む処理を実装します。外部ライブラリのインクルードも忘れずに。
#include <string>
#include <fstream>
#include <cassert>
#include <unordered_map>
#include "nlohmann/json.hpp"
//データの種類
enum class DATA
{
PLAYER, //プレイヤー
ENEMY //今回は使いません
};
//読み込んだデータを書くのする変数
std::unordered_map <DATA, nlohmann::json> jsonData_;
//読み込み
void LoadJson(const std::string& filename,const DATA dataType)
{
//fileNameは読み込むファイルのパスを指定
std::ifstream ifs(fileName);
assert(ifs.is_open() && "ファイルが開けません");
//ファイルストリームからjsonオブジェクトに変換
nlohmann::json data = nlohmann::json::parse(ifs);
// json jsonData
// ifs >> jsonData
//上記の方法でも可
//データを変数に格納する
jsonData_.emplace(dataType, data);
}
関数の引数にファイルパスとjsonデータのオブジェクトを指定します。今回はPlayerオブジェクトだけなので必要ないかもしれませんが、キャラクターの種類を増やしたりするときに、有効活用できるかも...?
あとはunordered_mapなどを使って読み込んだデータを保存しておきます。
この読み込み処理を使ってプレイヤーのパラメータを設定していきます。
//取得用
const json& GetJson(const std::string obj,const DATA dataType)
{
return jsonData_[dataType].at(obj);
}
//取得する前にデータを読み込んでおく
LoadJson("Player.json",DATA::PLAYER);
//読み込んだデータを取得
const json& playerInfo = GetJson("Player",DATA::PLAYER);
//座標や拡大率を取得する
const transformInfo = playerInfo.at("Transform");
//座標
pos.x = transformInfo.at("position")[0];
pos.y = transformInfo.at("position")[1];
pos.z = transformInfo.at("position")[2];
//拡大率
scale = transformInfo.at("scale");
//パラメータ取得
const auto& paramInfo = playerInfo.at("Parameter");
hp = paramInfo.at("hp");
isMuteki = paramInfo.at("muteki");
これで読み込んだデータを使うことができます。
3. まとめ
今回はJsonを使ったデータの読み込みでした。外部ライブラリを使用しますが、簡単に外部データを読み込むことができるので是非試してみてください。
読み込みのほかに、書き込みやデータの作成もできるので実装出来たらまた記録を残そうかと思います。
最後に
Jsonに関しては他の有識者の方の記事がたくさんありますのでそちらを参考にされたほうがより正確かもしれません。
まだまだ模索中なので間違っている部分もあるかもしれませんが、参考になれば幸いです。
[参考記事]https://qiita.com/YukkuriAzuki/items/b856811b9a5b012d4907