從零開始做3d地圖編輯器基于qt與ogre_第1頁
從零開始做3d地圖編輯器基于qt與ogre_第2頁
從零開始做3d地圖編輯器基于qt與ogre_第3頁
從零開始做3d地圖編輯器基于qt與ogre_第4頁
從零開始做3d地圖編輯器基于qt與ogre_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第一章 基礎知識注:文章里面有不少個人見解,歡迎大家一起互相討論。希望高人能給予相應理解與意見建議。在實際3D游戲開發(fā)中,編輯器是極其重要的一個部分,一個優(yōu)秀健壯的編輯器,可以使項目事半功倍,而相反,一款BUG超多(隨時會掛)又不注重操作習慣(完全基于快捷鍵,又沒有詳細的使用說明)的編輯器,不僅會使項目事倍功半,而且會削弱開發(fā)人員的積極性,甚至讓開發(fā)人員對項目產(chǎn)生排斥情緒。編輯器在游戲里面應用很廣泛,一般都有地圖編輯器(關卡、世界)、粒子編輯器、動畫編輯器、字體編輯器(單機里面較多)、UI編輯器、材質(zhì)編輯器、腳本編輯器等等,編輯器設計制作方法也大致可分為兩個趨勢,一種是傾向于做大而全的世界編輯

2、器,一種是做小而精的功能編輯器,在這里我不想討論這兩者的利與弊,我只能說,只要這個解決方案可以解決我們當前的問題,那么它就是一個適合現(xiàn)階段的解決方案,但并不一定是最好的解決方案。一、工具現(xiàn)在制作編輯器,流行以下幾種方式:1、 使用C#制作基于WinForm的編輯器。2、 制作基于MFC的編輯器。3、 制作基于WxWidgets的編輯器。4、 制作基于QT的編輯器?;贑#來制作編輯器,在制作一些小工具上面很有利,比如說打包工具,加密器等等和圖形關系不大的工具,它的優(yōu)勢在于它的簡單易用,但是當你涉及到圖形這一塊的時候,如果引擎支持不C#,那么使用XNA、Manage DX 都不是很好的一種解決方

3、案(除非你的游戲就是基于兩者),導入動態(tài)鏈接庫的方法又會比較麻煩,C#和C+之間還是有不小的區(qū)別。基于MFC做編輯器,在以前基本是首選,它的優(yōu)勢在于文檔應用特別多,你遇到問題的時候,基本上網(wǎng)絡上都能找到解決方案,但是它相對門檻高,一個初學者經(jīng)常會被它折磨得興趣殆盡,應用也很麻煩,特別是在多窗口應用上面,所以以前我用MFC做編輯器都是基于Dialog來做。WxWidgets和QT都是跨平臺的GUI 庫,目前來說還算主流,我個人傾向于QT,WxWidgets了解不多,QT目前由諾基亞負責,有自己的IDE、設計工具、詳細的例子、比較充實的文檔、與VS的結(jié)合還算完美,還有一些第三方的庫支持,網(wǎng)絡上的資

4、料也還多,是個發(fā)展?jié)摿Σ诲e的GUI庫。因為我將要做一個3D地圖編輯器,在圖形這一塊也有不少選擇,OGRE與Irrlicht等,我選擇使用OGRE,當然你也可以選擇自己的引擎。OGRE是一個開源的圖形渲染引擎,它的材質(zhì)腳本還是很強大的,簡單易用、目的性明確,讓你的Shader容易應用與修改。早期的版本在地形這一塊做得不夠,所以早期做OGRE的地形編輯時一般會選擇ETM,PLSM等庫,新的1.7版本對地形這一塊增強不少,而我也會在編輯器里面應用它地形編輯的功能。二、工具安裝指南1、OGRE下載與編譯OGRE官方網(wǎng)站:下載最高版本的OGRE(1.7.1),有兩種方式:第一種方式是直接下載SDK,下載

5、的SDK可以直接使用,但是由于編譯環(huán)境不同,可能會缺少一些DX的DLL,你得在網(wǎng)絡下另外下載缺少的DLL,下載方法是從網(wǎng)站左側(cè)的DownLoad里面選擇SDK,然后選擇相應VS的版本,我們推薦使用VS2008,因為QT針對2008做了一個AddIn。第二種方式是下載源代碼進行編譯。個人覺得使用OGRE應該使用自己編譯的庫,畢竟有什么需要的時候還可以自己修改,自己編譯需要注意幾點:1、除了OGRE源碼外,你需要額外下載Microsoft Visual C+ Dependencies Package,并把它解壓到OGRE目錄(你自己的OGRE目錄)后編譯。 2、你需要下載CMAKE,官方網(wǎng)站是。下

6、載一個最新版本就行。3、你機器需要安裝DX的SDK,不然OIS和DX的渲染系統(tǒng)插件無法編譯。4、使用Cmake生成Ogre VS解決方案的時候要記得指定Dependencies目錄(在Cmake提醒你的時候指定)。此過程可以參考用VS打開生成的解決方案,然后直接編譯就可以獲得dll和lib.2、QT下載QT官方網(wǎng)站:下載QT也有兩種方式,一種是純SDK(Qt SDK for Windows* (287 MB)),另外一種是針對VS2008的庫(Qt libraries 4.6.2 for Windows (VS 2008, 194 MB)),這兩者有一定的區(qū)別,前者帶有更多的工具(IDE等)。

7、我推薦下載針對VS2008的庫,下載安裝完之后,還需要下載一個Addin,這個Addin比較難找,在Other downloads里面下載Visual Studio Add-in (44 MB)。安裝完Add-In之后,打開VS2008應該就可以找到QT的模板了。QT4 projects下面有一些選項,選擇新建一個QT Application。新建完編譯通過,運行發(fā)現(xiàn)這是一個基本窗口。如果編譯OIS沒有成功,請在項目屬性里面填入DX的include和lib路徑。三、開始之前的配置我看到過很多同志在做項目時,直接新建項目后立馬就直接開始編程,使用的是VS默認目錄,結(jié)果在Debug的時候老是找不到

8、dll,找不到資源,然后又花了一堆的時間去查找問題,白白地浪費了不少時間,更有甚者就在此時便失去了繼續(xù)向下的動力,覺得這個東西太難理解了(一遇挫折就跑)。所以我覺得在每次開始項目前都應該好好地把解決方案配置一下。我做項目的時候喜歡這種方式,項目目錄下面存在以下幾個目錄。Bin目錄不難理解,里面放的是生成的可執(zhí)行文件,下面又分了Debug、Release、Data(Media)等目錄,Debug、Release里面放的是執(zhí)行文件和dll,命名的時候Debug要命名為_d.exe.因為資源文件是共用的,所以資源不應該放在Debug或Release下面,直接放Bin下面就行了。Docs目錄里面放的是

9、相關文檔。Objs目錄里面存放編譯過程中的中間文件,臨時文件。Scripts目錄里面存放解決方案,Sln或其他格式。SDKS 目錄存放第三方庫,比如OGRE,Boost,Lua等。Tools目錄存放著制作時的一些工具。剩下那個目錄一般改名為Src或source.為什么目錄要這樣分?Bin文件夾分出來有利于你程序的發(fā)布,調(diào)試。把Objs從source分出來,有利于你的源代碼版本控制,備份。把解決方案單獨拿出來,有利于你的跨平臺或換IDE,SDKS拿出來很重要,因為有可能兩年后你的引擎或者底層更新或者大改動過,但是你又需要把兩年前的游戲重新編譯,如果沒有備份好,結(jié)果自然不難想像。同樣,工具也是這樣

10、,比如說加密器算法經(jīng)常改動,你不備份好你的東西以后都沒有辦法修改了。接下來要調(diào)整VS來適應這一套目錄結(jié)構(gòu)。第一件事,用文本工具打開修改sln,把它指向source目錄里面的工程文件。# Visual Studio 2008Project(8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942) = Test, .SourceTest.vcproj, 83E01383-8BC1-404F-9C25-A9AFFCDBB210EndProject像上面那樣修改為你的工程名.之后用新的解決方案打開項目,在VS里項目名上右鍵打開屬性。之后的第一件事情就是修改工作目錄,很多同志就是因為沒

11、有設定這個目錄導致找不到DLL,它在配置屬性中調(diào)試一欄里面,修改成你當前的Bin所在目錄,最好設置為相對目錄,Debug模式下是./Bin/Debug,對應的Release下面是./Bin/Release。接著在常規(guī)里面修改中間目錄和輸出目錄,我們都修改成./Objs/Debug和./Objs/Release。之后在鏈接器常規(guī)里面修改輸出文件,修改成.binDebug$(ProjectName)_d.exe和./Bin/Release/$(ProjectName).exe。然后在C/C+常規(guī)中把你要的include添加進去,在鏈接器附加庫中把你要的lib目錄添加進去。完成這些我們就配置完了。附

12、:Ogre1.7.1的配置要注意:由于Ogre使用了boost,所以一定要把Ogre自帶的Boost目錄放進SDKs中,如果要使用OIS,還得包含OIS的頭文件路徑,庫文件和OGRE放在一起,所以不用再設置。另:如果是在IDE中新建QT Application,QT頭文件與庫的相關配置會自動幫你設置好。你只需要在它的基礎上把其他庫添加好就行了。四、QT基本知識回到QT,先在VS中新建一個QT Application,項目里面有幾個目錄:1、 Form Files目錄,它里面放的是使用QT designer制作的基于XML的布局文件,雙擊它就會自動進入QT designer。2、 Generat

13、ed Files目錄,它里面放的是一些臨時生成的文件,這些文件用來處理QT的信號和槽等機制。3、 Resource Files目錄,它里面放的是基于XML的資源文件,你可以在窗體里面使用它們。4、 Header Files和Source Files這兩個和VS默認是一樣的。理解了目錄結(jié)構(gòu)之后,先來試著寫一個Hello World,先把除了main.cpp之外的所有文件移除(使用QT designer會提高制作效率,但是會讓QT入門門檻變高)!打開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();編譯通過。運行沒有任何反應,因為還沒有往里面增加任何東西。在代碼中,Main函數(shù)是C語言的入口,之后申請的QApplication用來管理控制流和主要設置,這是核心,一定要保留。按鈕是GUI中最基本的一個控件,先看看怎么增加一個按鈕。使用按鈕控件必須先包含頭文件: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();代碼第一行是申請一個按鈕,并把按鈕的Caption標題設為

16、HELLO,第二行表示這個按鈕出現(xiàn)在屏幕坐標(100,100)的位置,寬高為(300,300),最后一行是顯示這個按鈕,你可以嘗試把它去掉看看效果(官方助手里有QPushButton的更多資料,請自行查看)。編譯出來,發(fā)現(xiàn)屏幕上出現(xiàn)一個框,框里面有一個按鈕,按鈕可以點擊,但是沒有任何反應,因為還沒有為這個按鈕增加任何的槽(Slot)。在MFC對控件的處理一般是通過事件機制,而在QT中是使用信號(Signal)和槽(Slot)機制,其實你也可以把它理解為事件機制。簡單理解信號其實就是輸入,而槽就是輸出,拿按鈕打比方,在一次點擊中,這個點擊,就是一個信號,而點擊后的反饋,就是槽。每一個控件都擁有一

17、些默認的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是信號,而method就是slot,type里面提供了幾種綁定方式,可以詳細查看助手。 先看一個例子,在上面代碼中加入點擊按鈕后關閉應用程序的效果。很簡單,只需要在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();編譯運行,點擊后窗體關閉。這是使用默認槽的例子,有時候需要點擊按鈕之后執(zhí)行自定義的效果,那么就需要使用自定義槽了。 下面是一個使用自定義Slot的例子,鼠標點擊按鈕之后,文本框文字會改變。先加入一個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沒有出現(xiàn)在窗體里面!它當然不會出現(xiàn)在窗體里面,因為我們只是對Button使用了Show()函數(shù),嘗試加入label.show(),結(jié)果出現(xiàn)了兩個窗體,一個里面有按鈕,另一

21、個里面有一個label。那么怎么把它們放在一起呢? 通過上面的測試發(fā)現(xiàn),調(diào)用一次show就會產(chǎn)生一個窗口,那么是不是只調(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();附上此時的頭文件列表:view plaincopy to clipboardprint?#include #include #inc

24、lude #include #include #include #include #include #include #include 一開始,我就申請了一個QWidget,QWidget類是QT中所有用戶界面對象的基類,它本身并沒有什么實際意義,在這里你可以把它看成一個窗體容器,然后又添加了一個QHBoxLayout layout; QHBoxLayout這是個可以對子widget進行特定布局的控件,通過它可以把按鈕和label并排,之后把窗體的layout設為指定的layout,然后調(diào)用show()。調(diào)試運行,終于兩個控件都出現(xiàn)了。回到之前的話題,自定義槽。在QT中所有自定義槽都需要先編譯

25、成moc,才可以被使用。不過你放心,這個過程由QT自動完成,當然你也可以手動進行編譯,QT的Bin目錄里面有moc.exe,參照說明進行使用。你應該可以看到我已經(jīng)偷偷把按鈕的點擊信號轉(zhuǎn)向了窗體的close槽。為什么要這樣做呢,因為我們需要把自定義槽函數(shù)定義放在頭文件里。第一步,先把window封裝起來,我新建一個MainWidget類,繼承自QWidget類,類的頭文件如下: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();編譯運行,結(jié)果和上次一樣。接下來申請一個自定義Slot,首先在頭文件public:前加入宏Q_OBJECT;只有加入了Q_OBJECT,你才能使用QT中的signal和slot機制。這點很重要,不然你編譯的時候會報“找不到slot”的錯誤。然后在protected: 前加入:view plaincopy to clipboardprint?private slots: void SetText ();private slots: void SetText ();slot同樣也分private、public、protected,意義和c+一樣。CPP中加入相應執(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、編譯運行,這時點擊按鈕就會改變文字了。就這么簡單。信號也可以自定義,不過信號自定義相對來說用武之地稍微小一點,定義的方式和slot定義差不多,都得在頭文件中定義,舉個例子:點擊按鈕后文本改變,觸發(fā)一個新信號,這個信號會把文字又變回來。在頭文件中加入:view plaincopy to clipboardprint?signals: void TextChanged ();signals: void TextChanged ();再增加一個Slot用來對這個信號進行反饋。在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);注意信號是不需要加執(zhí)行代碼。然后修改SetText()函數(shù)加入觸發(fā)新信號的代碼: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();編譯運行,結(jié)果和我們想要的一樣。注:信號和槽都是可以有參數(shù)的。有關QT的基礎知識就介紹到這里,具體控件的使用方法,請自行參考助手。五、OGRE基礎知識友善提醒:如果你對OGRE比較了解,請自覺跳過此節(jié)。本節(jié)并不打算提供詳細的入門教程,只是對OGRE的簡單介紹,如果需要OGRE

36、的詳細資料,請自行使用網(wǎng)絡功能。1、OGRE是什么 Ogre是一款開源的圖形渲染引擎,它的全名叫(Object-oriented Graphics Rendering Engine),目前在開源圖形渲染引擎這一塊排名第一,由于它功能齊全(跨平臺,支持DX和OPENGL)、知名度高,而且不斷更新,所以國內(nèi)學習資料也比較多,在網(wǎng)絡游戲在一塊已有不少游戲公司已經(jīng)使用過或者正在使用OGRE(天龍八部、成吉思汗等),部分公司招聘要求里面也明確表示熟悉OGRE者優(yōu)先,所以說學習OGRE是前景可觀的。2、OGRE可以做什么 首先OGRE只是一個圖形渲染引擎,連輸入輸出都使用第三方的OIS,目前大部分應用都在

37、游戲、VR。但是如果你需要用它來做網(wǎng)絡游戲,你還需要網(wǎng)絡庫、UI庫、音頻音效庫等。3、如何學習OGRE OGRE自1.7以來,拋棄了它的ExampleApplication的框架,開始使用SampleBrower加dll的方式來表示例子,我個人認為雖然看起來更專業(yè)了,但是對于新人入門來說,難度比 ExampleApplication還高,盡管ExampleApplication就已經(jīng)讓新人暈頭轉(zhuǎn)向了! 那么怎么去學習OGRE呢,有一本書是必備的,名字叫PRO OGRE 3D PROGRAMMING(現(xiàn)在已經(jīng)有愛好者翻譯的中文版了),這本書是OGRE入門的圣典,推薦方法是先仔細地看一遍,然后再重

38、頭開始碼例子,為什么推薦這樣做,因為我發(fā)現(xiàn)有些人在學習Opengl的時候,看完glbegin,glend就不看了,甚至還動手寫引擎,人家紅寶書后面明確地表明盡量不要使用glbegin,glend! 官方手冊也是必看的,里面對一些模塊進行了詳細的講解,材質(zhì)腳本說得挺細。 個人推薦OGRE入門掌握順序:A、 渲染窗體管理(初級:初始化,銷毀)B、 OIS輸入輸出(初級:兩種模式(回調(diào)、緩沖)、按鍵處理) C、場景管理(初級:管理器選擇,節(jié)點管理、實體管理) D、材質(zhì)(初級:材質(zhì)使用、材質(zhì)腳本) E、資源管理(初級:資源組、資源) D、動畫(初級:骨骼動畫) E、面片相關(初級:表層、公告板、粒子)

39、 基本掌握這些就可以做些簡單的游戲了,然后在這基礎之上再慢慢探索OGRE的龐大的世界。幾個學習的地方:1、OGRE官方網(wǎng)站:、官方論壇、Addon論壇、wiki是學習OGRE的好地方。 2、中文社區(qū):也聚集了不少OGRE的愛好者。 3、游戲資源網(wǎng)也是一個學習游戲開發(fā)的不錯的網(wǎng)站。請充分利用你手頭上面的搜索工具,百度適合搜索國內(nèi)中文資料,google適合搜索英文資料。第二章 編輯器的基本框架一、幾個問題前面說了很多編輯器之外的東西,真正要動手做編輯器了,也不能一股腦地就開始了,這之前必須要問自己幾個問題:1、這個地圖編輯器有什么基本功能?2、導入導出文件格式?A、3D地圖編輯器的基本功能正如開篇

40、所說,編輯器制作有兩種趨勢,其中一種是大而全的世界編輯器,這種方式可以帶給極大的成就感,正合很多新人的意,但是我覺得一開始給自己(特別是新人)設定一個龐大的計劃是件空洞而不現(xiàn)實的事情,一個編輯器越是大而全它的應用方向就越窄,越不利用拓展,使用就越費勁,問題BUG也就越集中,維護成本也就越高。其實可以從小做起,先來分析基本需求:所謂地圖編輯器,地圖編輯是其基礎功能,一般地圖都是在地形(平面)上面放置演員(把它叫作演員是不希望和OGRE的實體概念沖突),那么我們就確定了我們兩個需求:地形編輯、演員管理。 那么這兩個需求又引申出新的需求,地形不能是光模吧,演員不能永遠是編輯器預設的幾個模型吧,所以我

41、們又需要實體、紋理加載與刪除的功能。加載之后的紋理和實體總應該有個地方可以瀏覽吧,不然怎么選擇使用? 好了,因為我們的目標暫時是做一個基本框架。所以我們暫時確定以下基本需求:1、 添加刪除瀏覽實體、紋理2、 地形編輯3、 演員管理除了基本需求外,我們還有另外一些編輯器本身的一些需求:1、 菜單、工具欄、狀態(tài)欄。2、 日志管理。日志管理是一個很重要的東西,它得支持兩種方式,一種是導成文本,另一種是在編輯器里面實時看到,為什么要提供這兩種東西呢,如果沒有文本,有時候掛的時候你看不到為什么掛,如果沒有實時地看到每次去看文本又很麻煩。B、文件格式導入導出文件格式是一個很糾結(jié)的問題,現(xiàn)在一般流行幾種方式

42、:1、 純二進制數(shù)據(jù),優(yōu)點是讀取速度非??欤瑤缀鯚o浪費數(shù)據(jù),缺點是不易被修改,如果沒有工具基本上幾乎不可能被改動(當然你要約定某些字符串也是可以的),這種方法還有不少應用。2、 自定義格式,類似于INI,優(yōu)點是終于可能手動修改了,缺點是得花不少時間去寫解析模塊,應該是一種過渡解決方案,這種方案和上面那種有模糊的界定,區(qū)別在于這個擁有一個解析器。3、 XML,現(xiàn)在應該是主流,優(yōu)點是編輯修改很方式,手改也行,工具也很多,還不用寫解析器,TinyXML,RapidXML等都是不錯的解析器,缺點是效率低,在特定環(huán)境下會出現(xiàn)偶爾讀不出文件的情況(可能是解析器的問題)。現(xiàn)在不少游戲使用兩種1和3兩種方式結(jié)

43、合的方法,在編輯時使用XML,結(jié)果用工具導成純二進制加密文件,我也打算使用這種方法:編輯器配置文件(需要對窗體的開關狀態(tài)進行存儲)和生成的地圖使用XML。導入紋理、實體使用OGRE默認支持的格式。二、基本框架布局 根據(jù)上一節(jié)的一些基本需求,做出一個簡單的布局如下圖:窗體大?。?024*768,太大了有點顯示器放不下!支持最大化,最小化,關閉按鈕,支持手動拖大拖小。擁有菜單項(支持快捷鍵,圖標):File : New, Open, Save, Save As, ExitEdit: Undo, Redo,Copy, Paste(這個功能暫時保留)Window:Entity List, Textur

44、e List ,Node List, property,Log,(支持圖標check)Help:About工具欄擁有按鈕:New, Open, Save, Save As, Undo, Redo,Copy, Paste, Entity List, Texture List , Scene, property,Log,(部分支持check)Dock窗口(支持自由拖動,重新排列,疊加,關閉,打開):EntityList, Texture List, Node List, property,(這四個都可以是左右兩側(cè)),log窗口(只能在下側(cè))視口:OGRE的顯示窗口,大小可以改變。我們這里暫時只提供

45、一個窗口,通過狀態(tài)機加多個攝影機來管理瀏覽。各個Dock窗口都擁有自己的小工具欄,Entity ListTexture ListNode list都是樹型結(jié)構(gòu),欄目里面擁有相應添加刪除的子功能。屬性欄使用了QT的第三方庫,這個庫得另行下載,后面會有詳細介紹。日志欄使用QListWidget,提供SystemLog方法,添加日志后自動跳轉(zhuǎn)到最新。狀態(tài)欄顯示鼠標移上控件時的一些詳細說明。三、窗體、菜單欄、工具欄、狀態(tài)欄A、創(chuàng)建窗體 我還是按照QT基礎那節(jié)的內(nèi)容創(chuàng)建一個窗體類,不同的是這個窗體類現(xiàn)在繼承于QMainWindow,它會使得封裝中央部件、菜單條和工具條以及窗口狀態(tài)變得更容易。接下去,設置

46、標題和窗口大?。簐iew plaincopy to clipboardprint?setWindowTitle(Editor); /設置窗口標題 resize( WINDOW_WIDTH, WINDOW_HEIGHT);/ 設置窗口大小setWindowTitle(Editor); /設置窗口標題 resize( WINDOW_WIDTH, WINDOW_HEIGHT);/ 設置窗口大小其中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+里盡量減少使用宏。設置中央部件: view plaincopy to clipboardprint?setCentralWidget(m_pButton);/暫時把按鈕設置為中央部件setCentralWidget(m_pButton);/暫時把按鈕設置為中央部件為什么要設置中央部件呢?因為接下去我要使用Dock Widget,如果沒有中央部件,左側(cè),右側(cè),下部

48、就沒有參照,也沒意義了。 針對我們的基本框架,目前也僅僅需要這些簡單的功能。B、創(chuàng)建菜單欄和工具欄在QT創(chuàng)建菜單、工具欄前,必須先創(chuàng)建QAction,然后把這個QAction添加給菜單或者工具欄。QAction是什么,它是用戶的UI動作,在一列菜單中,比如說File下面的new 就是一個QAction,這個QAction包括包括圖標,名字,快捷方式,狀態(tài)欄信息等。我通過以下方法來設置QAction:頭文件中加入:view plaincopy to clipboardprint?QAction* m_p;QAction* m_p;因為工具欄和菜單都共用一個QAction,所以我把它用為類成員放在頭文件中。Cpp中加入:view plaincopy to clipboardprint?m_p = new QAction(QIcon(:/images/new.png), tr(&New), this); m_p - setShortcu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論