版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第一章 基礎(chǔ)知識(shí)注:文章里面有不少個(gè)人見(jiàn)解,歡迎大家一起互相討論。希望高人能給予相應(yīng)理解與意見(jiàn)建議。在實(shí)際3D游戲開(kāi)發(fā)中,編輯器是極其重要的一個(gè)部分,一個(gè)優(yōu)秀健壯的編輯器,可以使項(xiàng)目事半功倍,而相反,一款BUG超多(隨時(shí)會(huì)掛)又不注重操作習(xí)慣(完全基于快捷鍵,又沒(méi)有詳細(xì)的使用說(shuō)明)的編輯器,不僅會(huì)使項(xiàng)目事倍功半,而且會(huì)削弱開(kāi)發(fā)人員的積極性,甚至讓開(kāi)發(fā)人員對(duì)項(xiàng)目產(chǎn)生排斥情緒。編輯器在游戲里面應(yīng)用很廣泛,一般都有地圖編輯器(關(guān)卡、世界)、粒子編輯器、動(dòng)畫(huà)編輯器、字體編輯器(單機(jī)里面較多)、UI編輯器、材質(zhì)編輯器、腳本編輯器等等,編輯器設(shè)計(jì)制作方法也大致可分為兩個(gè)趨勢(shì),一種是傾向于做大而全的世界編輯
2、器,一種是做小而精的功能編輯器,在這里我不想討論這兩者的利與弊,我只能說(shuō),只要這個(gè)解決方案可以解決我們當(dāng)前的問(wèn)題,那么它就是一個(gè)適合現(xiàn)階段的解決方案,但并不一定是最好的解決方案。一、工具現(xiàn)在制作編輯器,流行以下幾種方式:1、 使用C#制作基于WinForm的編輯器。2、 制作基于MFC的編輯器。3、 制作基于WxWidgets的編輯器。4、 制作基于QT的編輯器?;贑#來(lái)制作編輯器,在制作一些小工具上面很有利,比如說(shuō)打包工具,加密器等等和圖形關(guān)系不大的工具,它的優(yōu)勢(shì)在于它的簡(jiǎn)單易用,但是當(dāng)你涉及到圖形這一塊的時(shí)候,如果引擎支持不C#,那么使用XNA、Manage DX 都不是很好的一種解決方
3、案(除非你的游戲就是基于兩者),導(dǎo)入動(dòng)態(tài)鏈接庫(kù)的方法又會(huì)比較麻煩,C#和C+之間還是有不小的區(qū)別。基于MFC做編輯器,在以前基本是首選,它的優(yōu)勢(shì)在于文檔應(yīng)用特別多,你遇到問(wèn)題的時(shí)候,基本上網(wǎng)絡(luò)上都能找到解決方案,但是它相對(duì)門(mén)檻高,一個(gè)初學(xué)者經(jīng)常會(huì)被它折磨得興趣殆盡,應(yīng)用也很麻煩,特別是在多窗口應(yīng)用上面,所以以前我用MFC做編輯器都是基于Dialog來(lái)做。WxWidgets和QT都是跨平臺(tái)的GUI 庫(kù),目前來(lái)說(shuō)還算主流,我個(gè)人傾向于QT,WxWidgets了解不多,QT目前由諾基亞負(fù)責(zé),有自己的IDE、設(shè)計(jì)工具、詳細(xì)的例子、比較充實(shí)的文檔、與VS的結(jié)合還算完美,還有一些第三方的庫(kù)支持,網(wǎng)絡(luò)上的資
4、料也還多,是個(gè)發(fā)展?jié)摿Σ诲e(cuò)的GUI庫(kù)。因?yàn)槲覍⒁鲆粋€(gè)3D地圖編輯器,在圖形這一塊也有不少選擇,OGRE與Irrlicht等,我選擇使用OGRE,當(dāng)然你也可以選擇自己的引擎。OGRE是一個(gè)開(kāi)源的圖形渲染引擎,它的材質(zhì)腳本還是很強(qiáng)大的,簡(jiǎn)單易用、目的性明確,讓你的Shader容易應(yīng)用與修改。早期的版本在地形這一塊做得不夠,所以早期做OGRE的地形編輯時(shí)一般會(huì)選擇ETM,PLSM等庫(kù),新的1.7版本對(duì)地形這一塊增強(qiáng)不少,而我也會(huì)在編輯器里面應(yīng)用它地形編輯的功能。二、工具安裝指南1、OGRE下載與編譯OGRE官方網(wǎng)站:下載最高版本的OGRE(1.7.1),有兩種方式:第一種方式是直接下載SDK,下載
5、的SDK可以直接使用,但是由于編譯環(huán)境不同,可能會(huì)缺少一些DX的DLL,你得在網(wǎng)絡(luò)下另外下載缺少的DLL,下載方法是從網(wǎng)站左側(cè)的DownLoad里面選擇SDK,然后選擇相應(yīng)VS的版本,我們推薦使用VS2008,因?yàn)镼T針對(duì)2008做了一個(gè)AddIn。第二種方式是下載源代碼進(jìn)行編譯。個(gè)人覺(jué)得使用OGRE應(yīng)該使用自己編譯的庫(kù),畢竟有什么需要的時(shí)候還可以自己修改,自己編譯需要注意幾點(diǎn):1、除了OGRE源碼外,你需要額外下載Microsoft Visual C+ Dependencies Package,并把它解壓到OGRE目錄(你自己的OGRE目錄)后編譯。 2、你需要下載CMAKE,官方網(wǎng)站是。下
6、載一個(gè)最新版本就行。3、你機(jī)器需要安裝DX的SDK,不然OIS和DX的渲染系統(tǒng)插件無(wú)法編譯。4、使用Cmake生成Ogre VS解決方案的時(shí)候要記得指定Dependencies目錄(在Cmake提醒你的時(shí)候指定)。此過(guò)程可以參考用VS打開(kāi)生成的解決方案,然后直接編譯就可以獲得dll和lib.2、QT下載QT官方網(wǎng)站:下載QT也有兩種方式,一種是純SDK(Qt SDK for Windows* (287 MB)),另外一種是針對(duì)VS2008的庫(kù)(Qt libraries 4.6.2 for Windows (VS 2008, 194 MB)),這兩者有一定的區(qū)別,前者帶有更多的工具(IDE等)。
7、我推薦下載針對(duì)VS2008的庫(kù),下載安裝完之后,還需要下載一個(gè)Addin,這個(gè)Addin比較難找,在Other downloads里面下載Visual Studio Add-in (44 MB)。安裝完Add-In之后,打開(kāi)VS2008應(yīng)該就可以找到QT的模板了。QT4 projects下面有一些選項(xiàng),選擇新建一個(gè)QT Application。新建完編譯通過(guò),運(yùn)行發(fā)現(xiàn)這是一個(gè)基本窗口。如果編譯OIS沒(méi)有成功,請(qǐng)?jiān)陧?xiàng)目屬性里面填入DX的include和lib路徑。三、開(kāi)始之前的配置我看到過(guò)很多同志在做項(xiàng)目時(shí),直接新建項(xiàng)目后立馬就直接開(kāi)始編程,使用的是VS默認(rèn)目錄,結(jié)果在Debug的時(shí)候老是找不到
8、dll,找不到資源,然后又花了一堆的時(shí)間去查找問(wèn)題,白白地浪費(fèi)了不少時(shí)間,更有甚者就在此時(shí)便失去了繼續(xù)向下的動(dòng)力,覺(jué)得這個(gè)東西太難理解了(一遇挫折就跑)。所以我覺(jué)得在每次開(kāi)始項(xiàng)目前都應(yīng)該好好地把解決方案配置一下。我做項(xiàng)目的時(shí)候喜歡這種方式,項(xiàng)目目錄下面存在以下幾個(gè)目錄。Bin目錄不難理解,里面放的是生成的可執(zhí)行文件,下面又分了Debug、Release、Data(Media)等目錄,Debug、Release里面放的是執(zhí)行文件和dll,命名的時(shí)候Debug要命名為_(kāi)d.exe.因?yàn)橘Y源文件是共用的,所以資源不應(yīng)該放在Debug或Release下面,直接放Bin下面就行了。Docs目錄里面放的是
9、相關(guān)文檔。Objs目錄里面存放編譯過(guò)程中的中間文件,臨時(shí)文件。Scripts目錄里面存放解決方案,Sln或其他格式。SDKS 目錄存放第三方庫(kù),比如OGRE,Boost,Lua等。Tools目錄存放著制作時(shí)的一些工具。剩下那個(gè)目錄一般改名為Src或source.為什么目錄要這樣分?Bin文件夾分出來(lái)有利于你程序的發(fā)布,調(diào)試。把Objs從source分出來(lái),有利于你的源代碼版本控制,備份。把解決方案單獨(dú)拿出來(lái),有利于你的跨平臺(tái)或換IDE,SDKS拿出來(lái)很重要,因?yàn)橛锌赡軆赡旰竽愕囊婊蛘叩讓痈禄蛘叽蟾膭?dòng)過(guò),但是你又需要把兩年前的游戲重新編譯,如果沒(méi)有備份好,結(jié)果自然不難想像。同樣,工具也是這樣
10、,比如說(shuō)加密器算法經(jīng)常改動(dòng),你不備份好你的東西以后都沒(méi)有辦法修改了。接下來(lái)要調(diào)整VS來(lái)適應(yīng)這一套目錄結(jié)構(gòu)。第一件事,用文本工具打開(kāi)修改sln,把它指向source目錄里面的工程文件。# Visual Studio 2008Project(8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942) = Test, .SourceTest.vcproj, 83E01383-8BC1-404F-9C25-A9AFFCDBB210EndProject像上面那樣修改為你的工程名.之后用新的解決方案打開(kāi)項(xiàng)目,在VS里項(xiàng)目名上右鍵打開(kāi)屬性。之后的第一件事情就是修改工作目錄,很多同志就是因?yàn)闆](méi)
11、有設(shè)定這個(gè)目錄導(dǎo)致找不到DLL,它在配置屬性中調(diào)試一欄里面,修改成你當(dāng)前的Bin所在目錄,最好設(shè)置為相對(duì)目錄,Debug模式下是./Bin/Debug,對(duì)應(yīng)的Release下面是./Bin/Release。接著在常規(guī)里面修改中間目錄和輸出目錄,我們都修改成./Objs/Debug和./Objs/Release。之后在鏈接器常規(guī)里面修改輸出文件,修改成.binDebug$(ProjectName)_d.exe和./Bin/Release/$(ProjectName).exe。然后在C/C+常規(guī)中把你要的include添加進(jìn)去,在鏈接器附加庫(kù)中把你要的lib目錄添加進(jìn)去。完成這些我們就配置完了。附
12、:Ogre1.7.1的配置要注意:由于Ogre使用了boost,所以一定要把Ogre自帶的Boost目錄放進(jìn)SDKs中,如果要使用OIS,還得包含OIS的頭文件路徑,庫(kù)文件和OGRE放在一起,所以不用再設(shè)置。另:如果是在IDE中新建QT Application,QT頭文件與庫(kù)的相關(guān)配置會(huì)自動(dòng)幫你設(shè)置好。你只需要在它的基礎(chǔ)上把其他庫(kù)添加好就行了。四、QT基本知識(shí)回到QT,先在VS中新建一個(gè)QT Application,項(xiàng)目里面有幾個(gè)目錄:1、 Form Files目錄,它里面放的是使用QT designer制作的基于XML的布局文件,雙擊它就會(huì)自動(dòng)進(jìn)入QT designer。2、 Generat
13、ed Files目錄,它里面放的是一些臨時(shí)生成的文件,這些文件用來(lái)處理QT的信號(hào)和槽等機(jī)制。3、 Resource Files目錄,它里面放的是基于XML的資源文件,你可以在窗體里面使用它們。4、 Header Files和Source Files這兩個(gè)和VS默認(rèn)是一樣的。理解了目錄結(jié)構(gòu)之后,先來(lái)試著寫(xiě)一個(gè)Hello World,先把除了main.cpp之外的所有文件移除(使用QT designer會(huì)提高制作效率,但是會(huì)讓QT入門(mén)門(mén)檻變高)!打開(kāi)main.cpp,僅保留以下代碼:view plaincopy to clipboardprint?#include int main(int arg
14、c, char *argv) QApplication a(argc, argv); return a.exec();#include int main(int argc, char *argv) QApplication a(argc, argv); return a.exec();編譯通過(guò)。運(yùn)行沒(méi)有任何反應(yīng),因?yàn)檫€沒(méi)有往里面增加任何東西。在代碼中,Main函數(shù)是C語(yǔ)言的入口,之后申請(qǐng)的QApplication用來(lái)管理控制流和主要設(shè)置,這是核心,一定要保留。按鈕是GUI中最基本的一個(gè)控件,先看看怎么增加一個(gè)按鈕。使用按鈕控件必須先包含頭文件:view plaincopy to clipboa
15、rdprint?#include #include 然后在QApplication a(argc, argv);與return a.exec();中間插入下面代碼:view plaincopy to clipboardprint?QPushButton button(HELLO); button.setGeometry(100,100,300,300); button.show();QPushButton button(HELLO); button.setGeometry(100,100,300,300); button.show();代碼第一行是申請(qǐng)一個(gè)按鈕,并把按鈕的Caption標(biāo)題設(shè)為
16、HELLO,第二行表示這個(gè)按鈕出現(xiàn)在屏幕坐標(biāo)(100,100)的位置,寬高為(300,300),最后一行是顯示這個(gè)按鈕,你可以嘗試把它去掉看看效果(官方助手里有QPushButton的更多資料,請(qǐng)自行查看)。編譯出來(lái),發(fā)現(xiàn)屏幕上出現(xiàn)一個(gè)框,框里面有一個(gè)按鈕,按鈕可以點(diǎn)擊,但是沒(méi)有任何反應(yīng),因?yàn)檫€沒(méi)有為這個(gè)按鈕增加任何的槽(Slot)。在MFC對(duì)控件的處理一般是通過(guò)事件機(jī)制,而在QT中是使用信號(hào)(Signal)和槽(Slot)機(jī)制,其實(shí)你也可以把它理解為事件機(jī)制。簡(jiǎn)單理解信號(hào)其實(shí)就是輸入,而槽就是輸出,拿按鈕打比方,在一次點(diǎn)擊中,這個(gè)點(diǎn)擊,就是一個(gè)信號(hào),而點(diǎn)擊后的反饋,就是槽。每一個(gè)控件都擁有一
17、些默認(rèn)的Signal和Slot,這些都可以在官方提供的助手中查看。綁定Signal和slot是使用靜態(tài)函數(shù)connect。函數(shù)原型是:view plaincopy to clipboardprint?Bool connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt:ConnectionType type = Qt:AutoConnection )Bool connect ( const QObject * sender, const char
18、 * signal, const QObject * receiver, const char * method, Qt:ConnectionType type = Qt:AutoConnection )其中sender是發(fā)送者,而receiver是接收者,signal是信號(hào),而method就是slot,type里面提供了幾種綁定方式,可以詳細(xì)查看助手。 先看一個(gè)例子,在上面代碼中加入點(diǎn)擊按鈕后關(guān)閉應(yīng)用程序的效果。很簡(jiǎn)單,只需要在view plaincopy to clipboardprint?button. setGeometry(100,100,300,300);button. setGe
19、ometry(100,100,300,300);后面加入view plaincopy to clipboardprint?QObject:connect(&button, SIGNAL(clicked(), &a, SLOT(quit();QObject:connect(&button, SIGNAL(clicked(), &a, SLOT(quit();編譯運(yùn)行,點(diǎn)擊后窗體關(guān)閉。這是使用默認(rèn)槽的例子,有時(shí)候需要點(diǎn)擊按鈕之后執(zhí)行自定義的效果,那么就需要使用自定義槽了。 下面是一個(gè)使用自定義Slot的例子,鼠標(biāo)點(diǎn)擊按鈕之后,文本框文字會(huì)改變。先加入一個(gè)QLabel控件,你先加入頭文件:view
20、plaincopy to clipboardprint?#include #include 然后在connect前加入view plaincopy to clipboardprint?QLabel label(World); label.setGeometry(50,50,300,300);QLabel label(World); label.setGeometry(50,50,300,300);先嘗試編譯一下,結(jié)果label沒(méi)有出現(xiàn)在窗體里面!它當(dāng)然不會(huì)出現(xiàn)在窗體里面,因?yàn)槲覀冎皇菍?duì)Button使用了Show()函數(shù),嘗試加入label.show(),結(jié)果出現(xiàn)了兩個(gè)窗體,一個(gè)里面有按鈕,另一
21、個(gè)里面有一個(gè)label。那么怎么把它們放在一起呢? 通過(guò)上面的測(cè)試發(fā)現(xiàn),調(diào)用一次show就會(huì)產(chǎn)生一個(gè)窗口,那么是不是只調(diào)用一次show就行了?把函數(shù)里面代碼改為:view plaincopy to clipboardprint?QApplication a(argc, argv); QWidget window; QPushButton button(HELLO); button.setGeometry(100,100,300,300); QLabel label(World); label.setGeometry(50,50,300,300); QHBoxLayout layout; Lay
22、out.addWidget(&button); Layout.addWidget(&label); QObject:connect(&button, SIGNAL(clicked(), &window, SLOT(close(); window.setLayout(&layout); window.show(); return a.exec();QApplication a(argc, argv); QWidget window; QPushButton button(HELLO); button.setGeometry(100,100,300,300); QLabel label(World
23、); label.setGeometry(50,50,300,300); QHBoxLayout layout; Layout.addWidget(&button); Layout.addWidget(&label); QObject:connect(&button, SIGNAL(clicked(), &window, SLOT(close(); window.setLayout(&layout); window.show(); return a.exec();附上此時(shí)的頭文件列表:view plaincopy to clipboardprint?#include #include #inc
24、lude #include #include #include #include #include #include #include 一開(kāi)始,我就申請(qǐng)了一個(gè)QWidget,QWidget類(lèi)是QT中所有用戶界面對(duì)象的基類(lèi),它本身并沒(méi)有什么實(shí)際意義,在這里你可以把它看成一個(gè)窗體容器,然后又添加了一個(gè)QHBoxLayout layout; QHBoxLayout這是個(gè)可以對(duì)子widget進(jìn)行特定布局的控件,通過(guò)它可以把按鈕和label并排,之后把窗體的layout設(shè)為指定的layout,然后調(diào)用show()。調(diào)試運(yùn)行,終于兩個(gè)控件都出現(xiàn)了。回到之前的話題,自定義槽。在QT中所有自定義槽都需要先編譯
25、成moc,才可以被使用。不過(guò)你放心,這個(gè)過(guò)程由QT自動(dòng)完成,當(dāng)然你也可以手動(dòng)進(jìn)行編譯,QT的Bin目錄里面有moc.exe,參照說(shuō)明進(jìn)行使用。你應(yīng)該可以看到我已經(jīng)偷偷把按鈕的點(diǎn)擊信號(hào)轉(zhuǎn)向了窗體的close槽。為什么要這樣做呢,因?yàn)槲覀冃枰炎远x槽函數(shù)定義放在頭文件里。第一步,先把window封裝起來(lái),我新建一個(gè)MainWidget類(lèi),繼承自QWidget類(lèi),類(lèi)的頭文件如下:view plaincopy to clipboardprint?#ifndef _MAIN_WIDGET_H_#define _MAIN_WIDGET_H_#include #include #include #incl
26、ude class MainWidget: public QWidgetpublic: MainWidget(); MainWidget();protected:private: QLabel* m_pLabel; QPushButton* m_pButton; QHBoxLayout* m_pLayout;#endifCPP如下:#include MainWidget.hMainWidget:MainWidget() m_pLabel = new QLabel(World); m_pLabel -setGeometry(50,50,300,300); m_pButton = new QPus
27、hButton (HELLO); m_pButton -setGeometry(100,100,300,300); m_pLayout = new QHBoxLayout(); m_pLayout - addWidget(m_pButton); m_pLayout - addWidget(m_pLabel); connect(m_pButton, SIGNAL(clicked(), this, SLOT(close(); setLayout(m_pLayout);MainWidget:MainWidget()#ifndef _MAIN_WIDGET_H_#define _MAIN_WIDGET
28、_H_#include #include #include #include class MainWidget: public QWidgetpublic: MainWidget(); MainWidget();protected:private: QLabel* m_pLabel; QPushButton* m_pButton; QHBoxLayout* m_pLayout;#endifCPP如下:#include MainWidget.hMainWidget:MainWidget() m_pLabel = new QLabel(World); m_pLabel -setGeometry(5
29、0,50,300,300); m_pButton = new QPushButton (HELLO); m_pButton -setGeometry(100,100,300,300); m_pLayout = new QHBoxLayout(); m_pLayout - addWidget(m_pButton); m_pLayout - addWidget(m_pLabel); connect(m_pButton, SIGNAL(clicked(), this, SLOT(close(); setLayout(m_pLayout);MainWidget:MainWidget()Main.cpp
30、改為:view plaincopy to clipboardprint?#include #include MainWidget.hint main(int argc, char *argv) QApplication a(argc, argv); MainWidget window; window.show(); return a.exec();#include #include MainWidget.hint main(int argc, char *argv) QApplication a(argc, argv); MainWidget window; window.show(); re
31、turn a.exec();編譯運(yùn)行,結(jié)果和上次一樣。接下來(lái)申請(qǐng)一個(gè)自定義Slot,首先在頭文件public:前加入宏Q_OBJECT;只有加入了Q_OBJECT,你才能使用QT中的signal和slot機(jī)制。這點(diǎn)很重要,不然你編譯的時(shí)候會(huì)報(bào)“找不到slot”的錯(cuò)誤。然后在protected: 前加入:view plaincopy to clipboardprint?private slots: void SetText ();private slots: void SetText ();slot同樣也分private、public、protected,意義和c+一樣。CPP中加入相應(yīng)執(zhí)行:v
32、iew plaincopy to clipboardprint?void MainWidget: SetText () m_pLabel - setText(Test);void MainWidget: SetText () m_pLabel - setText(Test);把connect改成:view plaincopy to clipboardprint?connect(m_pButton, SIGNAL(clicked(), this, SLOT(SetText ();connect(m_pButton, SIGNAL(clicked(), this, SLOT(SetText ();
33、編譯運(yùn)行,這時(shí)點(diǎn)擊按鈕就會(huì)改變文字了。就這么簡(jiǎn)單。信號(hào)也可以自定義,不過(guò)信號(hào)自定義相對(duì)來(lái)說(shuō)用武之地稍微小一點(diǎn),定義的方式和slot定義差不多,都得在頭文件中定義,舉個(gè)例子:點(diǎn)擊按鈕后文本改變,觸發(fā)一個(gè)新信號(hào),這個(gè)信號(hào)會(huì)把文字又變回來(lái)。在頭文件中加入:view plaincopy to clipboardprint?signals: void TextChanged ();signals: void TextChanged ();再增加一個(gè)Slot用來(lái)對(duì)這個(gè)信號(hào)進(jìn)行反饋。在private slots:后加入view plaincopy to clipboardprint?void Recover
34、Text ();void RecoverText ();CPP中加入執(zhí)行:view plaincopy to clipboardprint?void MainWidget:RecoverText() m_pLabel - setText(Hello);void MainWidget:RecoverText() m_pLabel - setText(Hello);注意信號(hào)是不需要加執(zhí)行代碼。然后修改SetText()函數(shù)加入觸發(fā)新信號(hào)的代碼:view plaincopy to clipboardprint?emit TextChanged();emit TextChanged();最后加入新的c
35、onnect:view plaincopy to clipboardprint?connect(this, SIGNAL(TextChanged(), this, SLOT(RecoverText();connect(this, SIGNAL(TextChanged(), this, SLOT(RecoverText();編譯運(yùn)行,結(jié)果和我們想要的一樣。注:信號(hào)和槽都是可以有參數(shù)的。有關(guān)QT的基礎(chǔ)知識(shí)就介紹到這里,具體控件的使用方法,請(qǐng)自行參考助手。五、OGRE基礎(chǔ)知識(shí)友善提醒:如果你對(duì)OGRE比較了解,請(qǐng)自覺(jué)跳過(guò)此節(jié)。本節(jié)并不打算提供詳細(xì)的入門(mén)教程,只是對(duì)OGRE的簡(jiǎn)單介紹,如果需要OGRE
36、的詳細(xì)資料,請(qǐng)自行使用網(wǎng)絡(luò)功能。1、OGRE是什么 Ogre是一款開(kāi)源的圖形渲染引擎,它的全名叫(Object-oriented Graphics Rendering Engine),目前在開(kāi)源圖形渲染引擎這一塊排名第一,由于它功能齊全(跨平臺(tái),支持DX和OPENGL)、知名度高,而且不斷更新,所以國(guó)內(nèi)學(xué)習(xí)資料也比較多,在網(wǎng)絡(luò)游戲在一塊已有不少游戲公司已經(jīng)使用過(guò)或者正在使用OGRE(天龍八部、成吉思汗等),部分公司招聘要求里面也明確表示熟悉OGRE者優(yōu)先,所以說(shuō)學(xué)習(xí)OGRE是前景可觀的。2、OGRE可以做什么 首先OGRE只是一個(gè)圖形渲染引擎,連輸入輸出都使用第三方的OIS,目前大部分應(yīng)用都在
37、游戲、VR。但是如果你需要用它來(lái)做網(wǎng)絡(luò)游戲,你還需要網(wǎng)絡(luò)庫(kù)、UI庫(kù)、音頻音效庫(kù)等。3、如何學(xué)習(xí)OGRE OGRE自1.7以來(lái),拋棄了它的ExampleApplication的框架,開(kāi)始使用SampleBrower加dll的方式來(lái)表示例子,我個(gè)人認(rèn)為雖然看起來(lái)更專(zhuān)業(yè)了,但是對(duì)于新人入門(mén)來(lái)說(shuō),難度比 ExampleApplication還高,盡管ExampleApplication就已經(jīng)讓新人暈頭轉(zhuǎn)向了! 那么怎么去學(xué)習(xí)OGRE呢,有一本書(shū)是必備的,名字叫PRO OGRE 3D PROGRAMMING(現(xiàn)在已經(jīng)有愛(ài)好者翻譯的中文版了),這本書(shū)是OGRE入門(mén)的圣典,推薦方法是先仔細(xì)地看一遍,然后再重
38、頭開(kāi)始碼例子,為什么推薦這樣做,因?yàn)槲野l(fā)現(xiàn)有些人在學(xué)習(xí)Opengl的時(shí)候,看完glbegin,glend就不看了,甚至還動(dòng)手寫(xiě)引擎,人家紅寶書(shū)后面明確地表明盡量不要使用glbegin,glend! 官方手冊(cè)也是必看的,里面對(duì)一些模塊進(jìn)行了詳細(xì)的講解,材質(zhì)腳本說(shuō)得挺細(xì)。 個(gè)人推薦OGRE入門(mén)掌握順序:A、 渲染窗體管理(初級(jí):初始化,銷(xiāo)毀)B、 OIS輸入輸出(初級(jí):兩種模式(回調(diào)、緩沖)、按鍵處理) C、場(chǎng)景管理(初級(jí):管理器選擇,節(jié)點(diǎn)管理、實(shí)體管理) D、材質(zhì)(初級(jí):材質(zhì)使用、材質(zhì)腳本) E、資源管理(初級(jí):資源組、資源) D、動(dòng)畫(huà)(初級(jí):骨骼動(dòng)畫(huà)) E、面片相關(guān)(初級(jí):表層、公告板、粒子)
39、 基本掌握這些就可以做些簡(jiǎn)單的游戲了,然后在這基礎(chǔ)之上再慢慢探索OGRE的龐大的世界。幾個(gè)學(xué)習(xí)的地方:1、OGRE官方網(wǎng)站:、官方論壇、Addon論壇、wiki是學(xué)習(xí)OGRE的好地方。 2、中文社區(qū):也聚集了不少OGRE的愛(ài)好者。 3、游戲資源網(wǎng)也是一個(gè)學(xué)習(xí)游戲開(kāi)發(fā)的不錯(cuò)的網(wǎng)站。請(qǐng)充分利用你手頭上面的搜索工具,百度適合搜索國(guó)內(nèi)中文資料,google適合搜索英文資料。第二章 編輯器的基本框架一、幾個(gè)問(wèn)題前面說(shuō)了很多編輯器之外的東西,真正要?jiǎng)邮肿鼍庉嬈髁?,也不能一股腦地就開(kāi)始了,這之前必須要問(wèn)自己幾個(gè)問(wèn)題:1、這個(gè)地圖編輯器有什么基本功能?2、導(dǎo)入導(dǎo)出文件格式?A、3D地圖編輯器的基本功能正如開(kāi)篇
40、所說(shuō),編輯器制作有兩種趨勢(shì),其中一種是大而全的世界編輯器,這種方式可以帶給極大的成就感,正合很多新人的意,但是我覺(jué)得一開(kāi)始給自己(特別是新人)設(shè)定一個(gè)龐大的計(jì)劃是件空洞而不現(xiàn)實(shí)的事情,一個(gè)編輯器越是大而全它的應(yīng)用方向就越窄,越不利用拓展,使用就越費(fèi)勁,問(wèn)題BUG也就越集中,維護(hù)成本也就越高。其實(shí)可以從小做起,先來(lái)分析基本需求:所謂地圖編輯器,地圖編輯是其基礎(chǔ)功能,一般地圖都是在地形(平面)上面放置演員(把它叫作演員是不希望和OGRE的實(shí)體概念沖突),那么我們就確定了我們兩個(gè)需求:地形編輯、演員管理。 那么這兩個(gè)需求又引申出新的需求,地形不能是光模吧,演員不能永遠(yuǎn)是編輯器預(yù)設(shè)的幾個(gè)模型吧,所以我
41、們又需要實(shí)體、紋理加載與刪除的功能。加載之后的紋理和實(shí)體總應(yīng)該有個(gè)地方可以瀏覽吧,不然怎么選擇使用? 好了,因?yàn)槲覀兊哪繕?biāo)暫時(shí)是做一個(gè)基本框架。所以我們暫時(shí)確定以下基本需求:1、 添加刪除瀏覽實(shí)體、紋理2、 地形編輯3、 演員管理除了基本需求外,我們還有另外一些編輯器本身的一些需求:1、 菜單、工具欄、狀態(tài)欄。2、 日志管理。日志管理是一個(gè)很重要的東西,它得支持兩種方式,一種是導(dǎo)成文本,另一種是在編輯器里面實(shí)時(shí)看到,為什么要提供這兩種東西呢,如果沒(méi)有文本,有時(shí)候掛的時(shí)候你看不到為什么掛,如果沒(méi)有實(shí)時(shí)地看到每次去看文本又很麻煩。B、文件格式導(dǎo)入導(dǎo)出文件格式是一個(gè)很糾結(jié)的問(wèn)題,現(xiàn)在一般流行幾種方式
42、:1、 純二進(jìn)制數(shù)據(jù),優(yōu)點(diǎn)是讀取速度非???,幾乎無(wú)浪費(fèi)數(shù)據(jù),缺點(diǎn)是不易被修改,如果沒(méi)有工具基本上幾乎不可能被改動(dòng)(當(dāng)然你要約定某些字符串也是可以的),這種方法還有不少應(yīng)用。2、 自定義格式,類(lèi)似于INI,優(yōu)點(diǎn)是終于可能手動(dòng)修改了,缺點(diǎn)是得花不少時(shí)間去寫(xiě)解析模塊,應(yīng)該是一種過(guò)渡解決方案,這種方案和上面那種有模糊的界定,區(qū)別在于這個(gè)擁有一個(gè)解析器。3、 XML,現(xiàn)在應(yīng)該是主流,優(yōu)點(diǎn)是編輯修改很方式,手改也行,工具也很多,還不用寫(xiě)解析器,TinyXML,RapidXML等都是不錯(cuò)的解析器,缺點(diǎn)是效率低,在特定環(huán)境下會(huì)出現(xiàn)偶爾讀不出文件的情況(可能是解析器的問(wèn)題)?,F(xiàn)在不少游戲使用兩種1和3兩種方式結(jié)
43、合的方法,在編輯時(shí)使用XML,結(jié)果用工具導(dǎo)成純二進(jìn)制加密文件,我也打算使用這種方法:編輯器配置文件(需要對(duì)窗體的開(kāi)關(guān)狀態(tài)進(jìn)行存儲(chǔ))和生成的地圖使用XML。導(dǎo)入紋理、實(shí)體使用OGRE默認(rèn)支持的格式。二、基本框架布局 根據(jù)上一節(jié)的一些基本需求,做出一個(gè)簡(jiǎn)單的布局如下圖:窗體大小:1024*768,太大了有點(diǎn)顯示器放不下!支持最大化,最小化,關(guān)閉按鈕,支持手動(dòng)拖大拖小。擁有菜單項(xiàng)(支持快捷鍵,圖標(biāo)):File : New, Open, Save, Save As, ExitEdit: Undo, Redo,Copy, Paste(這個(gè)功能暫時(shí)保留)Window:Entity List, Textur
44、e List ,Node List, property,Log,(支持圖標(biāo)check)Help:About工具欄擁有按鈕:New, Open, Save, Save As, Undo, Redo,Copy, Paste, Entity List, Texture List , Scene, property,Log,(部分支持check)Dock窗口(支持自由拖動(dòng),重新排列,疊加,關(guān)閉,打開(kāi)):EntityList, Texture List, Node List, property,(這四個(gè)都可以是左右兩側(cè)),log窗口(只能在下側(cè))視口:OGRE的顯示窗口,大小可以改變。我們這里暫時(shí)只提供
45、一個(gè)窗口,通過(guò)狀態(tài)機(jī)加多個(gè)攝影機(jī)來(lái)管理瀏覽。各個(gè)Dock窗口都擁有自己的小工具欄,Entity ListTexture ListNode list都是樹(shù)型結(jié)構(gòu),欄目里面擁有相應(yīng)添加刪除的子功能。屬性欄使用了QT的第三方庫(kù),這個(gè)庫(kù)得另行下載,后面會(huì)有詳細(xì)介紹。日志欄使用QListWidget,提供SystemLog方法,添加日志后自動(dòng)跳轉(zhuǎn)到最新。狀態(tài)欄顯示鼠標(biāo)移上控件時(shí)的一些詳細(xì)說(shuō)明。三、窗體、菜單欄、工具欄、狀態(tài)欄A、創(chuàng)建窗體 我還是按照QT基礎(chǔ)那節(jié)的內(nèi)容創(chuàng)建一個(gè)窗體類(lèi),不同的是這個(gè)窗體類(lèi)現(xiàn)在繼承于QMainWindow,它會(huì)使得封裝中央部件、菜單條和工具條以及窗口狀態(tài)變得更容易。接下去,設(shè)置
46、標(biāo)題和窗口大?。簐iew plaincopy to clipboardprint?setWindowTitle(Editor); /設(shè)置窗口標(biāo)題 resize( WINDOW_WIDTH, WINDOW_HEIGHT);/ 設(shè)置窗口大小setWindowTitle(Editor); /設(shè)置窗口標(biāo)題 resize( WINDOW_WIDTH, WINDOW_HEIGHT);/ 設(shè)置窗口大小其中WINDOW_WIDTH和WINDOW_HEIGHT被定義在頭文件中:view plaincopy to clipboardprint?static const int WINDOW_WIDTH = 102
47、4; static const int WINDOW_HEIGHT = 768;static const int WINDOW_WIDTH = 1024; static const int WINDOW_HEIGHT = 768;在C+里盡量減少使用宏。設(shè)置中央部件: view plaincopy to clipboardprint?setCentralWidget(m_pButton);/暫時(shí)把按鈕設(shè)置為中央部件setCentralWidget(m_pButton);/暫時(shí)把按鈕設(shè)置為中央部件為什么要設(shè)置中央部件呢?因?yàn)榻酉氯ノ乙褂肈ock Widget,如果沒(méi)有中央部件,左側(cè),右側(cè),下部
48、就沒(méi)有參照,也沒(méi)意義了。 針對(duì)我們的基本框架,目前也僅僅需要這些簡(jiǎn)單的功能。B、創(chuàng)建菜單欄和工具欄在QT創(chuàng)建菜單、工具欄前,必須先創(chuàng)建QAction,然后把這個(gè)QAction添加給菜單或者工具欄。QAction是什么,它是用戶的UI動(dòng)作,在一列菜單中,比如說(shuō)File下面的new 就是一個(gè)QAction,這個(gè)QAction包括包括圖標(biāo),名字,快捷方式,狀態(tài)欄信息等。我通過(guò)以下方法來(lái)設(shè)置QAction:頭文件中加入:view plaincopy to clipboardprint?QAction* m_p;QAction* m_p;因?yàn)楣ぞ邫诤筒藛味脊灿靡粋€(gè)QAction,所以我把它用為類(lèi)成員放在頭文件中。Cpp中加入:view plaincopy to clipboardprint?m_p = new QAction(QIcon(:/images/new.png), tr(&New), this); m_p - setShortcu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 習(xí)作:寫(xiě)信 說(shuō)課稿-2024-2025學(xué)年四年級(jí)上冊(cè)語(yǔ)文統(tǒng)編版
- 光學(xué)玻璃選材與光學(xué)設(shè)計(jì)考核試卷
- 塑料回收與再利用考核試卷
- 2025年度鐵藝護(hù)欄行業(yè)規(guī)范制定與執(zhí)行合同3篇
- 二零二五年度新能源發(fā)電項(xiàng)目投資合作協(xié)議范本3篇
- 中介服務(wù)協(xié)議:2024年版房地產(chǎn)居間一
- 布萊希特戲劇的法律書(shū)寫(xiě)研究
- LT通信集團(tuán)鎮(zhèn)江分公司基層員工滿意度提升策略研究
- 2025年挖掘機(jī)械安全操作培訓(xùn)合同3篇
- 2025年度西瓜種植戶與農(nóng)產(chǎn)品加工企業(yè)合作合同3篇
- 中藥飲片培訓(xùn)課件
- 林區(qū)防火專(zhuān)用道路技術(shù)規(guī)范
- 2023社會(huì)責(zé)任報(bào)告培訓(xùn)講稿
- 2023核電廠常規(guī)島及輔助配套設(shè)施建設(shè)施工技術(shù)規(guī)范 第8部分 保溫及油漆
- 2025年蛇年春聯(lián)帶橫批-蛇年對(duì)聯(lián)大全新春對(duì)聯(lián)集錦
- 表B. 0 .11工程款支付報(bào)審表
- 警務(wù)航空無(wú)人機(jī)考試題庫(kù)及答案
- 空氣自動(dòng)站儀器運(yùn)營(yíng)維護(hù)項(xiàng)目操作說(shuō)明以及簡(jiǎn)單故障處理
- 新生兒窒息復(fù)蘇正壓通氣課件
- 法律顧問(wèn)投標(biāo)書(shū)
- 班主任培訓(xùn)簡(jiǎn)報(bào)4篇(一)
評(píng)論
0/150
提交評(píng)論