在寫工具的時候,物件屬性的編輯是很麻煩的問題(要開一大堆的介面、一大堆的判斷式、繁瑣的通知事件…等等),有沒有更的的做法呢?其實有,那就是讓XML跟物件掛勾…
掛勾有什麼好處?要怎麼掛勾呢?
只參考XML最大的好處,就是可以提升可攜性,修改屬性資料不用參照到真實的物件,但修改完之後,要如何驅動物件的相關函式呢?以TinyXML為例:
pElement->SetUserData(pObject);
其中Object為最原始的類別,再為其規劃一個虛擬函式
virtual bool DoPropertyChange(const std::string& strPorpertyName, const std::string& strValue) = 0;
讓之後繼承的人去實作相關的屬性改變後,應該驅動那些表現性的函式,就可以達到這個目標。這樣一來,所有屬性的驅動方式可以封裝在各個物件,再也不用在介面寫像這樣的code了…
CWater* pWater = SceneManager::GetSingleton().GetWater(m_iTargetObjectId);
if(pWater)
{
if(strAttributeName == "Float_Size")
{
pWater->SetScaleFactor(CVector3(NewValue, 1.0f, NewValue));
CVector3 Position;
theApp.GetTestPushRipplePosition(Position);
pWater->PushRipple(Position.m_fX, Position.m_fZ, theApp.GetTestPushRippleValue());
return true;
}
else if(strAttributeName == "Int_Complexity")
{
pWater->ResetComplexity(NewValue);
CVector3 Position;
theApp.GetTestPushRipplePosition(Position);
pWater->PushRipple(Position.m_fX, Position.m_fZ, theApp.GetTestPushRippleValue());
return true;
}
else if(strAttributeName == "MaterialName")
{
return pWater->ResetMaterialNmae(GetStringValue(NewValue));
}
else if(strAttributeName == "NoiseModule")
{
return pWater->ResetNoiseModuleName(GetStringValue(NewValue));
}
else if(strAttributeName == "Bool_EnableRipple")
{
return pWater->ChangeRippleState(NewValue);
}
else if(strAttributeName == "Float_Strength")
{
pWater->SetStrength(NewValue);
return true;
}
else if(strAttributeName == "CVector3_Position")
{
CVector3 Position;
Position.ReadFromString(GetStringValue(NewValue));
return pWater->SetPosition(Position);
}
}
return false;
整個介面都清爽起來,大大降低Dependency、提升ReUse,好久沒有這麼舒服了…
您好, 我也是用Ogre的開發者, 最近也遇到這狀況
回覆刪除我有個核心lib提供物件給編輯器和遊戲使用
照這篇XML榜物件的方式, 在編輯器開發上確實俐落好看
但在遊戲時, 並不需要編輯那些XML相關的資訊, 這時反而佔了多餘的記憶體(因為不會被使用)
這做法似乎是個trade-off? 不知道您有什麼看法?
我覺得這個部份很好處理,原則上物件仍然要提供SetPosition的函式,而DoPropertyChange這個函式是要留給編輯器call的,而在非編輯器的app時,並不用保存這一份xml,這樣應該就可以解決。
回覆刪除請問你們是製作輪迴unknown的人嗎?
回覆刪除我好不容易從youtube上看到
輪迴是我國中時買來玩的
當時覺得不管畫面跟操作還有劇情都很棒!
由於懷念所以又去網購了一次
但是完全進不去了!
不知是電腦太新跑不動還是怎樣
想請問一下!
我是製作成員之一,我還有保留一片,改天我安裝起來試試,看能不能跑.
回覆刪除