Programming

[2010] 沙漠商旅C的遊戲設計(3)-GLtools


作者:NDark

時間﹔201001

GLSelect / GLWinFont / GLCamera / GLBillboard

這幾個元件是利用OpenGL機制所開發出來的工具。
Camera與Billboard是一款3D遊戲基本必備的元件,我想各遊戲引擎應該都有。
在沙漠商旅C中Billboard是用來在城市頭上顯示城市的名稱。
原本是為了要研究兩種不同的Billboard才撰寫的。但是後來只完成簡易的那一版。

Camera物件值得提到的一點是Camera Shift,此功能常受到很多人的忽略。
簡單來講,在控制Camera的時候程式設計師應該秉持著一個原則
“讓他動,不要叫他動"
( let it move , not set it move )
才不會因為場景的快速變化導致過度設定攝影機使得場景不協調的狀況出現。

顯示字體的Font物件是沿用口古月遊戲引擎的做法,加以整理。
之前也在版上有提過了,
簡單來講是動態的利用windows的CreateFont與wglUseFontOutlines來製造文字的3D外型。
將3D外型傳送給顯示卡製作Display List。然後繪圖時再呼叫該Display List辨識標籤。

特色有

  • 不用在開始的時候讀入什麼字型檔。
  • 也不用一開始宣告一堆記憶體。
  • 可以使用windows內的字型。
  • 繪圖前可以指定不同大小,顏色。
  • 可在3D空間中呈現。
  • 可以搭配Billboard。

使用上是呼叫,並指定位置,字串內容,及大小。

winFont.PrintWFont( _x , _y , _z , _str , _scale ) ;

最後是說明GLSelect這個物件
算是一個OpenGL的內建點選機制,我只是把它包成一個類別使用。
原理是命令OpenGL切換一個叫做select buffer來畫東西,當畫在這個buffer上的時候。
會取代顏色而把一個像辨識標籤的東西畫上去。其他部分與繪圖相同。
因此我們可以對螢幕上的像素取得該像素的識別標籤,
[註]http://www.pling.org.uk/cs/cgvimg/zbuffer.png

zbuffer.png
zbuffer.png

於是可以知道滑鼠所在位置的是什麼物件。
更甚者,因為與繪圖無異,所以不只傳回最靠近的物件,
在該位置被蓋住一串的物件也通通可以紀錄下來。

使用上就是在要檢查點選的時候(通常是滑鼠click事件的時候)去開啟功能

SelectSystem.OpenGLPickStart( _mouseX , _mouseY ) ;

然後在指定各物件標籤的狀況下繪出要被點選的物件。

SelectSystem.OpenGLPickSetName( id ) ;

最後是關閉並取回資訊

SelectSystem.OpenGLPickEnd() ;

譬如說有無點選到,以及第幾順位被點選到的標籤是什麼。

SelectSystem2D.GetHitID()

另外一個OpenGL Select物件的特色是提供了一個遮罩器(filter),
可以讓取得點選的紀錄暫時無視/只看某些物件標籤。
譬如當要某些按鈕沒反應的時候可以使用。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s