最近在給公司里碼一個場景編輯器,大致得實現的功能有:
地形高度刷
地形紋理刷
放置小物件和房屋
放置粒子系統
設置路徑點和只能攝像機點
算是個簡單的不能再簡單的場景編輯器了吧...但是這樣的一個工具還是很頭痛的,特別是用C++來寫...
頭痛的原因不是別的,正是這個表現層和后臺數據同步問題。這個在C++的UI庫中目前還真沒有什么現成的好辦法,于是開始造輪子,為MFC寫了PropertySet和OperatorStack。
首先這個UI數據和內存數據雙向同步的問題直接讓我崩潰了...由于以前寫過一些工具,知道這東西如果不做個設計就開始沖著功能寫的話會有什么后果。嗯,于是繼承封裝了CMFCPropertyGridCtrl控件,為每個葉子屬性項封裝了一個LeafItem,根據屬性名來更新PropertySet里對應的數據......具體實現幾千字略- - 最終成型時代碼這樣:
DynamicObject obj;
propertyGrid.attachObject(obj);
這里的DynamicObject繼承PropertySet,于是propertyGrid控件就會顯示obj里所有的屬性數據了...然后是雙向更新問題,目前是給Property里加了一個eventValueChanged事件響應,讓PropertyGridCtrl監聽這些數據的變化,而propertyGridCtrl這個UI上的數據變化同樣是派生實現CMFCPropertyGridCtrl的值變化響應函數來給綁定的LeafItem更新數據,也是直接就刷新到Property里了。
還有OperatorStack.....這個是操作棧,記錄用戶操作的,用于撤銷和重做的操作,也用到了PropertySet來記錄變化對象的屬性快照,嗯,叫SnapShootRecord的類里面記錄的都是一個對象的變化屬性。
先就記錄這么多,很亂很不容易懂,主要給我自己做個記錄的,沒啥貢獻,實際上還有很多不好用的地方,所以最近在想一些改進設計,等我想好了放上來詳細設計和源碼吧.......