皐月と作業報告の候
新しくゲームを作り始めました
ゲームエンジンはゲームを作るためのものです。使ってみてはじめてわかる粗がたくさんあるわけです。その修正でまだAPIは安定しません・・・。
今後はゲームを作りながら、その都度 Lumino のほうも更新していきます。
ちなみにキャラ2D、マップ3Dなゲームが好きです。
シーングラフへの Entity Component System の導入
ゲームというのは仕様変更が頻発しがちな、ある種の特殊なシステムです。
変更に対して柔軟に対応するため一般的にはオブジェクト指向で作りますが、 is-a の関係を簡単に破壊するような変更よく起こります。
その解決策のひとつが Entity Component System です。Unity をはじめとして昨今のゲームエンジンはみんな備えているアレです。 機能を部品として分割し、オブジェクトは部品の集合体として定義する、そんな仕組みを入れています。
シリアライズ
Jsonファイルを簡単にシリアライズできる機能を作りました。 boost::serialization と同じようなものですが、Object を継承したオブジェクトをシリアライズする場合、型情報を利用した高度なシリアライズが可能になっています。
class EventData : public Object { public: String name; float x; float y; float z; String textureName; List<Variant> commands; void Serialize(Archive& ar, int version) { ar & LN_NVP(name); ar & LN_NVP(x); ar & LN_NVP(y); ar & LN_NVP(z); ar & LN_NVP(textureName); ar & LN_NVP(commands); } }; struct MapData { String displayName; String meshName; List<RefPtr<EventData>> events; void Serialize(Archive& ar, int version) { ar & LN_NVP(displayName); ar & LN_NVP(meshName); ar & LN_NVP(events); } };
{ "displayName": "map1", "meshName": "MapMesh1.mqo", "events": [ { "name": "EV000", "x": 1.0, "y": 1.0, "z": 1.0, "textureName": "chara_1.png", "commands" : [100, 101, 102] }, { "name": "EV001", "x": -1.0, "y": 1.0, "z": 1.0, "textureName": "chara_1.png", "commands" : [100, 101, 102] } ] }
MapData data = JsonSerializer::Load<MapData>(Assets::LoadText("MapData.json")); data.events[1]->name; // => "EV001"
とりあえずマップデータとかをツクールMVライクな JSON で用意していく方向で。
ビルド方法
Lumino のビルド方法を簡単にまとめました。 https://github.com/lriki/Lumino/wiki/BuildingWindows