2011-06-17 46 views
2

所以,我正在使用DirectX 9和C++進行簡單的遊戲。我查看了SDK的GUI,但我認爲我可以實現更簡單的事情。C++ GUI Events/Messaging Design

所有我想要的是窗口,標籤,按鈕,文本框和複選框。

我創建了一個基類GUIObject,它們都從中繼承而來。它包括大小和焦點等基本知識。然後派生類,例如GUILabel,都定義了render(),update()和whatnot。

我的問題是如何處理事件,如點擊?我使用GUILabel :: Click()來定義基於當前實例的文本成員值的所有可能性。它感覺不對,我意識到需要點擊的每個標籤都必須在GUILabel類中定義。我想將其移至每個遊戲狀態的代碼。

所以,我簡單地嘗試讓GUILabel :: Click()將函數指針作爲參數。但是後來我意識到我需要將狀態的類成員方法設置爲靜態(不是真的可行,除非其中的所有內容都是靜態的,對嗎?),或者也將其傳遞給GUIObject類。這是要走的路嗎?

我可以在遊戲狀態中定義GUILabel的派生(或按鈕,或whatnot),只是覆蓋我需要的任何操作?然後在那個狀態下做那些我需要的任何控制?

什麼是實現事件處理的正確方法?

+0

我想知道怎樣才能像Java的Swing中,在我的情況下,遊戲狀態從一些GUI元素派生設計這個(比如窗口),並且所有動作定義在他們自己的方法中,並通過(使用boost庫,希望)作爲回調。我會看看這是怎麼回事。我不太喜歡這一點,並試圖破解它以獲得遊戲的肉,但看到大部分遊戲取決於此GUI交互,我想有一個小小的規劃會有很長的路要走...... – Nick

回答

3

您可能需要考慮使用信號庫(如boost::signals),以便您靈活地定義GUI對象與每個回調將觸發的基礎事件之間的接口。它也可以用於需要GUI元素(例如狀態指示器等)的反向關係以響應潛在事件。

1

對於回調/點擊事件我會用boost :: function/boost :: bind去。 在我的GUI框架中,我曾經有兩個不同的抽象類InputHandler和Renderable用於處理觸摸和渲染。這導致設計中不需要點擊的組件(如UILabel)不需要實現無用的方法。

HTH, 亞歷