2015-12-13 41 views
2

我正在從頭開始設計一個簡單的GUI框架作爲一個項目,使用OpenGL和其他任何外部的東西,並且需要一些關於如何實現用戶交互的建議。簡單的OpenGL GUI框架用戶交互建議?

基本上,我有一個基類GUIItem從中所有元素繼承。這給每個項目一些基本的變量,如位置,一個包含子元素的矢量以及一些鼠標移動和點擊的基本功能。

所有元素的設置都與上面相關的成員變量一樣。

我在努力的是如何正確實現用戶交互。在我的窗口管理器中,我將創建一個項目的新實例,如GUIButton,並將其稱爲button1。窗口管理器在點擊發生時會遍歷其元素列表和它們可能具有的任何子元素,根據其座標,高度和寬度計算對象周圍的矩形區域,然後運行與之關聯的任何「點擊」功能說的項目,就像更改textlabel1的值。

首先,有沒有更好的方法來做這個計算?它可以用於矩形元素,但球形物體和其他物體會有可能被點擊的更大的錯誤區域。理想情況下,我會檢查像素,但我不知道如何實現。我聽說過但從來沒有使用GLUT(我的項目只允許使用它來處理鼠標/鍵盤交互)。在這種情況下,GLUT是否提供任何幫助?

我的主要問題是如何處理實際發生「點擊」事件時會發生的情況。例如,在GUIButton的例子中,內置了一個「點擊」功能,所以就我所知,我必須做一些事情,比如讓它成爲虛擬功能,這意味着我創建的每個新按鈕都必須具有它自己的類只是爲了覆蓋「點擊」功能,而按鈕的每個實例都將是一個簡單地從GUIButton繼承的獨特類的實例。這對我來說似乎很混亂,因爲我不知道我會在哪裏存儲所有這些類,並且似乎有很多額外的代碼。我會創建一個button1.cpp和button1.h文件嗎?

對此的任何建議真的會受到歡迎,因爲我是C++,OpenGL的新手,並且這是我第一次接觸到GUI編程,當現有的GUI框架是平常的時候,並沒有太多需要繼續選擇。

+0

你的'GUIItem'有一些問題。並不是所有的GUI元素都應該能夠有孩子等等。 – deviantfan

+0

關於您的球形物體:在父項中,只需使用矩形檢查,並且球形物體可以根據其形狀檢查更多自身。 ...不要遍歷所有像素。對象中必須有一些規律性,或者不是?根據形狀的不同,它需要一點點算術來檢查它是否被點擊,但仍然不會迭代像素。 – deviantfan

+0

關於Button應該做什麼:你知道函數指針和函數嗎?沒有理由爲每個按鈕創建一個新課程。 – deviantfan

回答

1

,如果你想要的東西太簡單和快速的那麼你可以:

  1. 創建包含ID/index/pointer,而非彩色陰影屏幕緩衝區
  2. 預渲染此緩衝區

    只需渲染你的每個視覺組件,而不是着色/紋理,只需填寫即可呈現組件的。不要忘記首先清除一些NULL ...之後,你應該有你的組件的面具。你需要做的只是這一次......

  3. 鼠標事件

    你簡單地轉換鼠標座標的陰影屏幕空間,並挑選價值。如果它是NULL那麼你點擊或空白區域。如果它包含ID而不是更新或調用組件ID的回調。如果你有一個所有組件的列表,那麼ID可以是列表索引,否則使用它的實際指針或編碼方式(component_type, component_index)。正如你所看到的,這是非常快的O(1)項目選擇,無論你有多少組件...陰影屏幕可以有不同的分辨率,然後你的實際屏幕(以保存內存)。

無論組件的形狀如何,它都具有像素完美的鼠標選擇精度,無需嵌套組件搜索循環。

[注意事項]

正如我在這裏做這個東西是一些提示:

創建組件的單屏幕的window包含配置。程序通常具有不同組件組的多個屏幕,並且僅僅因爲切換頁面/屏幕而反覆動態地重複屏幕。

使用單獨的組件列表每個組件類型一個列表。

創建IDE編輯窗口請參閱drag & drop example in C++它可能會得到方便。添加get,set功能string/enum or flag控制易於獲取/更改屬性,使對象檢查器成爲可能。另外這是IDE如何礦山的樣子:

vcl ide

窗口保存從IDE直接作爲C++代碼,我就可以複製到我的應用程序。這是一個沒有旋鈕上面的例子(忘了保存):

//--------------------------------------------------------------------------- 
// OpenGL VCL window beg: win 
    win.grid.allocate(0); 
    win.grid.num=0; 
    win.scale.allocate(0); 
    win.scale.num=0; 
    win.button.allocate(0); 
    win.button.num=0; 
    win.knob.allocate(0); 
    win.knob.num=0; 
    win.scrollbar.allocate(3); 
    win.scrollbar.num=3; 
    win.scrollbar[0].x0=200.0; 
    win.scrollbar[0].y0=19.0; 
    win.scrollbar[0].xs=256.0; 
    win.scrollbar[0].ys=16.0; 
    win.scrollbar[0].fxs=8.0; 
    win.scrollbar[0].fys=19.0; 
    win.scrollbar[0].name="_vcl_scrollbar0"; 
    win.scrollbar[0].hint=""; 
    win.scrollbar[0].min=0.000; 
    win.scrollbar[0].max=1.000; 
    win.scrollbar[0].pos=0.000; 
    win.scrollbar[0].dpos=0.100; 
    win.scrollbar[0].horizontal=1; 
    win.scrollbar[0].style=0; 
    win.scrollbar[0].resize(); 
    win.scrollbar[1].x0=200.0; 
    win.scrollbar[1].y0=45.0; 
    win.scrollbar[1].xs=256.0; 
    win.scrollbar[1].ys=16.0; 
    win.scrollbar[1].fxs=8.0; 
    win.scrollbar[1].fys=19.0; 
    win.scrollbar[1].name="_vcl_scrollbar1"; 
    win.scrollbar[1].hint=""; 
    win.scrollbar[1].min=0.000; 
    win.scrollbar[1].max=1.000; 
    win.scrollbar[1].pos=0.000; 
    win.scrollbar[1].dpos=0.100; 
    win.scrollbar[1].horizontal=1; 
    win.scrollbar[1].style=0; 
    win.scrollbar[1].resize(); 
    win.scrollbar[2].x0=200.0; 
    win.scrollbar[2].y0=70.0; 
    win.scrollbar[2].xs=256.0; 
    win.scrollbar[2].ys=16.0; 
    win.scrollbar[2].fxs=8.0; 
    win.scrollbar[2].fys=19.0; 
    win.scrollbar[2].name="_vcl_scrollbar2"; 
    win.scrollbar[2].hint=""; 
    win.scrollbar[2].min=0.000; 
    win.scrollbar[2].max=1.000; 
    win.scrollbar[2].pos=0.000; 
    win.scrollbar[2].dpos=0.100; 
    win.scrollbar[2].horizontal=1; 
    win.scrollbar[2].style=0; 
    win.scrollbar[2].resize(); 
    win.interpbox.allocate(0); 
    win.interpbox.num=0; 
    win.dblist.allocate(0); 
    win.dblist.num=0; 
// OpenGL VCL window end: win 
//--------------------------------------------------------------------------- 

看這裏plotting real time Data on Oscillocope圖像的一些想法(我得到這個工作既GDI和OpenGL)

這是更好地使用像素單位而不是OpenGL<-1,+1>屏幕單位爲更好的視覺質量和編輯的舒適度。