新しい物理法則エンジンの作成方法について述べる。
namespace Spr{;
}
で閉じられる必要がある(インクルードは別でよい)。SGOBJECTDEF(PHTestEngine);と書けばよい。これは<FileIO/FIDocScene.h>で宣言されているため インクルードが必要。
SGOBJECTIMP(PHTestEngine, SGBehaviorEngine);
class PHTestEngineLoader:public FIObjectLoader<PHTestEngine>{
public:
PHTestEngineLoader(){}
virtual bool LoadData(FILoadScene* ctx, PHTestEngine* test){}
};
class PHTestEngineSaver:public FIObjectSaver<PHTestEngine>{
virtual UTString GetType() const{ return "PHTestEngine"; }
virtual void SaveData(FISaveScene* ctx, FIDocNodeBase* doc, PHTestEngine* test){}
};DEF_REGISTER_BOTH(PHTestEngine);ここの引数を使って登録するため名前は宣言と合わせること。
DEF_RECORD(XTestEngine,{
//コードの部分は、~\Microsoft Visual Studio\Common\Tools\GUIDGEN.EXEで作成したコードを記述する。
GUID Guid(){ return WBGuid("コード"); }
データの宣言;
});
データの宣言では、Xファイルに合わせたデータ型でなければいけないため、
typedef Vec3f Vector;このように、型を合わせる必要がある。
UTRef<FITypeDescDb> db = new FITypeDescDb;
db->SetPrefix("X");
db->REG_FIELD(Vector); //型を合わせたときの宣言型
db->REG_RECORD_PROTO(XTestEngine); //DEF_RECORDの最初の引数と合わせるXTestEngine tes;このように記述。
virtual bool LoadData(FILoadScene* ctx, PHMTestEngine* test){
ctx->docs.Top()->GetWholeData(test->tes);
return true;
}
逆にデータに代入する場合、
virtual void SaveData(FISaveScene* ctx, FIDocNodeBase* doc, PHTestEngine* test){
doc->SetWholeData(test->tes);
}
②の場合、
virtual bool LoadData(FILoadScene* ctx, PHMTestEngine* test){
XTestEngine tes;
ctx->docs.Top()->GetWholeData(tes);
自分の考えた形でメンバ変数に代入
return true;
}
逆にデータに代入する場合、
virtual void SaveData(FISaveScene* ctx, FIDocNodeBase* doc, PHTestEngine* test){
XTestEngine tes;
自分の考えた形で上の構造体に代入
doc->SetWholeData(tes);
}bool PHTestEngine::AddChildObject(SGObject* o, SGScene* s){
if(DCAST(PHSolid, o)){
solid = (PHSolid*)o;
return true;
}
return false;
}
子オブジェクトを持つクラスを保存する場合はSaveData関数は使えない。代わりに
Save()を使う。
virtual void Save(FISaveScene* ctx, SGObject* arg){
手動でノードを作成する必要あり
PHTestEngine* test = (PHSolid*)arg;
FIDocNodeBase* doc = ctx->CreateDocNode("TestEngine", test);
ctx->docs.back()->AddChild(doc);
XTestEngine tes;
自分の考えた形で上の構造体に代入
doc->SetWholeData(tes);
子オブジェクトへの参照ノードを作成
if (test->solid){
doc->AddChild(ctx->CreateDocNode("REF", test->solid));
}
}