[心得] 沙漠商旅C的遊戲設計(3)
作者:NDark
時間﹔201001
沙漠商旅C的遊戲設計(3) - GLSelect / GLWinFont / GLCamera / GLBillboard
http://wp.me/pBAPd-b0
這幾個元件是利用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

於是可以知道滑鼠所在位置的是什麼物件。
更甚者,因為與繪圖無異,所以不只傳回最靠近的物件,
在該位置被蓋住一串的物件也通通可以紀錄下來。
使用上就是在要檢查點選的時候(通常是滑鼠click事件的時候)去開啟功能
SelectSystem.OpenGLPickStart( _mouseX , _mouseY ) ;
然後在指定各物件標籤的狀況下繪出要被點選的物件。
SelectSystem.OpenGLPickSetName( id ) ;
最後是關閉並取回資訊
SelectSystem.OpenGLPickEnd() ;
譬如說有無點選到,以及第幾順位被點選到的標籤是什麼。
SelectSystem2D.GetHitID()
另外一個OpenGL Select物件的特色是提供了一個遮罩器(filter),
可以讓取得點選的紀錄暫時無視/只看某些物件標籤。
譬如當要某些按鈕沒反應的時候可以使用。
--
"May the Balance be with U"(願平衡與你同在)
視窗介面遊戲設計教學( http://0rz.tw/V28It ),討論,分享。歡迎來信。
視窗程式設計(Windows CLR Form)遊戲架構設計(Game Application Framework)
遊戲工具設計(Game App. Tool Design )
電腦圖學架構及研究(Computer Graphics)論文代讀(含投影片製作)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.77.176
※ 編輯: NDark 來自: 140.96.77.176 (03/11 17:23)
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章