所以我寫了一個遊戲引擎,利用數據驅動設計從xml文件實例化各種角色。我最近完成了對事件管理系統的編碼,並且所有事情都會觸發事件,並且處理程序正確地捕獲事件。考慮到我使用了成員函數指針和模板,這並非易事。我現在遇到的問題是,我希望能夠做這樣的事在xml文件:本機C++的數據驅動設計
<InputComponent>
<Event EventName="GainedFocus" OnEvent="Initialize"/>
</InputComponent>
的問題應該是很明顯的。 C++沒有反射形式,因此就我所知,不能從字符串「Initialize」中獲得Initialize函數的地址。這意味着對於稍微不同的輸入成分,我從類中派生出來並註冊特定於該實例的事件並添加函數。此外,應當知道,這是比我處理典型的輸入方式不同:
<InputComponent>
<Mapping Type="MousePress" Button=1 Command="RotateCamera"/>
</InputComponent>
在這種情況下的映射是特定於輸入部件的元件和命令本身是與工廠創建的對象。雖然我不能通過通用事件來做到這一點。命令是對不同對象執行完全相同操作的特定項目,而對象或組件本身通常需要以不同方式處理各個事件。有沒有人做過這樣的事情?真正好奇的是,某人可以如何去做這樣的事情,以便需要註冊到對象的事件不必被硬編碼到類中。
編輯:讓我這樣說吧。相同類型組件的不同實例需要對事件做出不同的反應。這將是特定於應用程序的,因此應該與引擎代碼分開(我不應該修改組件)。用戶應該能夠提供函數,然後可以在響應事件時調用函數。函數和事件都應該能夠綁定到XML中。我開始認爲這在非託管C++中可能是不可能的,因爲沒有任何形式的元數據可以根據同名字符串查找用戶提供的函數。
是的,我認爲的全部問題來自於這樣一個事實,即我的委託是通過使用成員函數指針的模板完成的,這意味着實際的組件類本身必須更改爲添加事件處理程序。否則,我可以使用泛型函數指針,並像你說的那樣將它們添加到樹中。我認爲用成員函數指針來做這件事的唯一方法是讓組件包含通用的事件處理程序類。這樣我就不必更改組件本身,但可以編寫這些類的版本並將它們插入需要的地方。 – user3355098 2014-11-21 22:34:44
另外問題是,我無法從沒有某種反射的xml中的字符串表示中找到Initialize函數的實際入口點。如果我能做到這一點,那麼使用動態數據結構來存儲和執行基於事件ID將很簡單。我想知道如何在XML中使用「Initialize」字符串,並讓我的XML解析代碼創建一個實際上可以找到具有相同名稱的函數的入口點的委託。 – user3355098 2014-11-21 23:09:50