2012-01-16 25 views
3

背景:我在C++/OpenGL中做了一個簡單的太陽系模擬。研究:我試過搜索,但我只找到有關小部件,閃存和HCI資料的文章。如何實現點擊式用戶交互模型?

問題:我希望用戶能夠點擊演員,然後取消選擇或選擇其他內容。也許一次選擇多個演員。如果演員被摧毀,我希望選擇離開。我希望演員知道它已被選中。

我知道如何獲得鼠標座標,以及如何查看是否發生了這個演員或那個演員或最近的演員的點擊。我沒有任何經驗做的是建模交互。我可以想到CSS的主動,懸停和按下模型,所以我猜想某種狀態。但是隨後我會遇到所有權問題,如果該演員被刪除或需要刪除,會發生什麼情況?是否應該有某種觀察者?

很明顯,我不明白這個問題足以爲我的目的嘗試解決它。我沒有回調或事件或任何經驗。任何人都可以給我一些文章,指南或類似的幫助嗎?

+0

我認爲你的問題太廣泛了;從常見問題解答:*「你的問題應該是合理的範圍,如果你能想象整本書能夠回答你的問題,你就會問得太多。」*你能縮小一點嗎? – 2012-01-16 23:18:56

+0

這就是爲什麼我的問題不是「我該怎麼做?」而是「我在哪裏可以學習如何做到這一點?」。 – whiterook6 2012-01-17 17:13:55

回答

1

如果您正在爲演員使用智能指針(例如boost::shared_pointer),那麼您可以通過使用弱指針進行選擇,輕鬆解決所有權問題。例如:

std::set<boost::weak_pointer<Actor> > selected_actors; 

你只需要知道你從集合中獲取任何指針可能是無效的,但升壓幾乎迫使你檢查。


對於演員,知道什麼時候它的選擇,我只想讓由您選擇代碼調用一些虛成員函數,例如:

class Actor { 
public: 
    ... 
    virtual void on_selected() { } 
    virtual void on_deselected() { } 
    ... 
}; 

如果您還需要演員是否它的選擇,以保持跟蹤,像這樣做:

class Actor { 
bool selected; 
public: 
    Actor() : selected(false) { } 
    ... 
    void selected() { selected = true; on_selected(); } // not virtual 
    void deselected() { selected = false; on_deselected(); } // not virtual 
    ... 
protected: 
    ... 
    virtual void on_selected() { } 
    virtual void on_deselected() { } 
}; 

希望有幫助!

+0

謝謝。我已經在使用弱指針了,這確實解決了所有權問題。所選演員的集合也是一個好主意,如果一個被刪除,它可以從集合中刪除。如果我確實有一大堆選定的演員,讓演員詢問它是否被選中會更有意義嗎?這樣,選定的參與者列表將成爲是否選擇對象的權威。 – whiterook6 2012-01-17 17:11:48

+0

是的,你可以這樣做,或兩種方式。或者,如果這符合你的架構,你可以將'bool selected'傳遞給需要這些信息的[Actor]上的每個函數(例如'draw(bool selected)'),以便演員不需要訪問某個全局​​選擇管理器。 – Thomas 2012-01-18 14:51:34

0

我建議快速瀏覽一下Qt。它會做你想要的和更多的。在大多數情況下,你可以採取你想要的,離開你不想要的。

它還有一個很好的方法來將OpenGL代碼與您之後的用戶界面的更友好的元素進行封裝/集成。