C++遊戲程式設計(一開篇)

pamxy發表於2013-05-04

轉自:http://blog.csdn.net/zh634455283/article/details/8251253

本系列文章由zhmxy555(毛星雲)編寫,轉載請註明出處。 


http://blog.csdn.net/zhmxy555/article/details/7318264


作者:毛星雲    郵箱: happylifemxy@qq.com    大家別叫我樓主可以嗎- -.請叫我淺墨



在從第一節開始看這個筆記系列的話,大家會發現,一上來就開始講DirectX相關的內容但是寫了幾節之後,又開始講

GDI了。

這是因為我寫完前幾節後,發覺直接講DirectX有些生硬。最後我想了一下,應該先梳理完GDI相關的重點知識,再來講

DirectX,畢竟遊戲程式設計裡面windows API是基礎。所以先講windows API,接著介紹DirectX,最後講解遊戲引擎的設

,這樣會自然得多。


                                                                                               ————淺墨於2012年3月26日注




很多朋友在評論中都談到了GDI的效率問題。關於GDI,我想在這一系列文章的篇首簡單的說明一下。

用GDI做遊戲的效率很低,非常的不推薦。但是GDI作為windows與生俱來的渲染引擎,在圖形方面是一個全能的存在。

學習遊戲程式設計如果想打好一個堅實的基礎,掌握GDI是非常有必要的,全能的GDI可以在DirectX尚未做好準備的時候,以一個

強大後援的姿態,在遊戲的測試與模擬過程中給予我們莫大的幫助。


                                                                                              ————淺墨於2012年4月26日注




很多朋友也談到遊戲開發中是否運用MFC的困惑,我也在這裡簡單的說明一下。由於MFC有底層程式碼的隱蔽性等特點,且MF

C畢竟封裝了很多實際上沒用到的東西,不利於遊戲開發的效率和遊戲的執行速度,不適合做遊戲開發。MFC做遊戲地圖編輯

器之類的工具軟體倒是比較適合。我覺得一款成功的遊戲最基本的特點就是具有流暢的使用者體驗,這個要求達不到的話,其他

方面就不用考慮了。


 

                                                                                                      ————淺墨於2012年4月27日注



 

在淺墨沒更新文章的這三個月裡,數百位需要遊戲程式設計相關資料的朋友在部落格裡留了郵箱,沒有及時給大家發到郵箱裡淺墨表示非常抱歉。在這裡,淺墨最終還是決定把這些資料打包上傳到CSDN下載頻道,這樣大家就可以直接下載,省去了淺墨發郵件的功夫,雖然淺墨一直認為這樣更親切更真誠。當然,0資源分下載是必須的。

以後大家想要這些資料,就不用再留郵箱了,直接點連結去下載就好了。

 

下面是這些資料的一個清單(零程式設計基礎開始):

 

1.《C++ primer中文版》

2.《Windows程式設計第五版》

3.《VC++深入詳解》

4.《Windows核心程式設計》

5.《Effective STL中文版》

6.《Windows遊戲程式設計大師技巧》

7.《DIRECTX.9.0.3D遊戲開發程式設計基礎》

 

這個書單是從零程式設計基礎開始的,其中部分書中涉及到了DirectDraw與Direct3D 8,這兩個API在新版本DirectX SDK中都被移除了,現在基本上無用武之地,所以涉及到DirectDraw與Direct3D 8的那部分就不用仔細看了哈。

本來還有《VC++深入詳解》的高清影印版,以及《遊戲程式設計精粹》系列的7本書,以及幾本C++系列的經典之作,但是它們塊頭比較大,淺墨目前這個號在CSDN下載頻道只有110Mb的上傳限權,傳起來比較麻煩。暫時就不傳了。 

 

下面給出遊戲開發學習資料的下載連結

 

請點選這裡下載:零基礎遊戲程式設計學習資料by淺墨

 

(免責宣告:淺墨在這裡只是進行了電子版的收集工作,如果大家覺得這些書還不錯,建議去買紙質版,畢竟這樣對眼睛的健康有好處,健康是金錢買不來的)

 

                                                                                                             ————淺墨於2012年11月07日

 

關於學完DirectX,我們該幹什麼。

淺墨覺得,歷代DirectX龍書的作者Frank Luna在龍書忽視了非常重要的一方面內容的講解,那就是就是學完了DirectX我們接著該做什麼。

這大概是很多懷揣遊戲開發夢想的熱血青年們曾經思考過的問題。

 

淺墨也曾經在這問題上迷茫過,也因為沒人指明前路而走了不少彎路。

不過後來在黑暗中不斷地摸索,將荊棘變成坦途之後,終於摸索出了一條正確的道路。

也就是看完龍書《DIRECTX.9.0.3D遊戲開發程式設計基礎》之後,我們需要如何學習,來把學到的知識立體化,最終轉化為開發遊戲的實際能力。首先我們需要再看一本書,《Real-Time Rendering》,也就是(RTR)實時渲染技術,目前出到第三版了。(這本書並沒有中文版,大家如果要走遊戲開發的道路,讀完龍書之後,剩下基本上都要靠讀英文書了。)

學完龍書,也可以選擇自己喜歡的遊戲引擎來接觸並掌握了。看完龍書後淺墨首推學習Irrlight,然後進階推薦Orge。兩者都是開源遊戲引擎,都有著原始碼提供下載學習,而且網上對這兩種引擎的研究熱情很高,資料豐富,引擎程式碼字裡行間都是哲思,掌握其中的程式碼並納為己用,自己寫出像樣的遊戲demo來是不成任何問題的。


 

                                                                                                  ————淺墨於2012年12月02日


 


 


作為visual C++,DirectX入門的第一講,概念性東西比較多,這裡我們只是簡單的整理一下知識框架,給大家一個大概的認知體系,

後續文章中,我們會展開進行深入的講解。



1.DirectX的定義

首先,我們必須瞭解DirectX的定義。DirectX,(Direct eXtension,簡稱DX)是由微軟公司建立的多媒體程式設計介面。由C++程式語言實現,遵循COM。被廣泛使用於Microsoft Windows、Microsoft Xbox和Microsoft Xbox 360電子遊戲開發,並且只能支援這些平臺。最新版本為DirectX 11,建立在最新的Windows 7上。Microsoft DirectX 是這樣一組技術:它們旨在使基於Windows 的計算機成為執行和顯示具有豐富多媒體元素(例如全色圖形、視訊、3D 動畫和豐富音訊)的應用程式的理想平臺。DirectX 包括安全和效能更新程式,以及許多涵蓋所有技術的新功能。應用程式可以通過使用DirectX API 來訪問這些新功能。


2.必要的工具和開發環境

要進行遊戲的開發,我們必須擁有一套最新的DirectX SDK(軟體開發包)。我們可以從微軟的官方下載站進行下載然後安裝,這裡貼出地址,http://msdn.microsoft.com/zh-cn/directx/aa937788.aspx。當然我們還要擁有開發環境,我們選擇Microsoft公司的Visual Studio 2010。



3.引擎設計概述

遊戲引擎是一系列高階程式碼,我們可以以它為基礎開發自己的遊戲。現代的遊戲引擎已經對使用他的人隱藏了底層實現的細節和規範。例如,可以在OpenGL和Direct3D的基礎上開發渲染引擎,這樣,引擎使用者就不需要知道使用的是哪一個渲染引擎,儘管也用到了一些底層的東西。

遊戲引擎包括:渲染引擎,物理引擎,聲音引擎等。遊戲引擎本身只是一個由更小的引擎組成的集合。遊戲引擎或它涵蓋的內容並沒有一個精確的定義。

對於視訊遊戲而言,它的遊戲引擎至少要包含渲染引擎和輸入引擎,這是必須的,否則,就不能稱其為互動式遊戲。

遊戲程式設計師和遊戲引擎程式設計師完成的是兩種不同的工作。遊戲程式設計師只與開發遊戲的遊戲引擎打交道,而遊戲引擎程式設計師要開發出其他人用於開發遊戲的引擎。


4.遊戲引擎中的幾個關鍵系統

遊戲引擎中的幾個關鍵系統有:遊戲渲染系統,輸入系統,聲音系統,物理系統,動畫系統,人工智慧(AI)系統等。


5. DirectX API函式

DirectX的API主要由DirectGraphics,DirectInput,DirectPlay,DirectMusic,DirectSound組成。每個API之間相互獨立,負責完成DirectX核心中不同的功能。DirectX中每個API都可以通過硬體加速,這意味著這些API可以直接和執行軟體的底層硬體對話。下面是各種API函式的概要解釋。

DirectGraphics:

DirectGraphics為負責向螢幕渲染二維圖形和三維圖形的DirectX API,也就是眾所周知的Direct3D。

DirectInput:

DirectInput是可以直接使用所有與計算機關聯的輸入裝置的DirectX API。這些裝置包括鍵盤,滑鼠和遊戲控制器裝置。

DirectPlay:

DirectPlay是控制Direct中網路功能的Direct API。DirectPlay可以讓應用程式對機器進行網路功能設定,從而可以通過和其他網路玩家交流。

DirectMusic:

DirectMusic是負責普通聲音處理的DirectX API。

DirectSound:

DirectSound是負責高階聲音處理的DirectX API。


6.動手寫一個視窗

在Windows中使用Direct3D建立Win32視窗非常簡單。要建立一個Win32視窗就必須擁有一個WinMain()函式(這不是廢話是什麼)。我們可以在MSDN中查到WinMain()的標準句法

int WINAPI WinMain(          

HINSTANCE hInstance,

    HINSTANCE hPrevInstance,

    LPSTR lpCmdLine,

    int nCmdShow

);

當程式第一次執行時,WinMain()函式中的所有引數從系統獲取自己的相應引數值。通過在WinMain函式內部建立一個型別為WNDCLASSSEX的視窗類物件,建立視窗,然後顯示視窗,然後進行訊息迴圈,就可以實現一個空視窗的顯示。具體實現程式碼如下:


下面是上面講的框架程式碼,也是後面的筆記二的基礎,需要結合筆記二一起看。

  1. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.    switch(msg)  
  4.       {  
  5.          case WM_DESTROY:  
  6.             PostQuitMessage(0);  
  7.             return 0;  
  8.             break;  
  9.       }  
  10.    return DefWindowProc(hWnd, msg, wParam, lParam);  
  11. }  
  12. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)  
  13. {  
  14.  WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,  
  15.                      hInst, NULL, NULL, NULL, NULL,  
  16.                      "AppClass", NULL };  
  17.     
  18.  RegisterClassEx(&wc);  
  19.    // Create the application's window  
  20.              HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME,   
  21. WS_OVERLAPPEDWINDOW,  
  22.         100, 100, 640, 480, NULL, NULL,  
  23.                             hInst ,NULL);  
  24.          ShowWindow(hWnd, SW_SHOWDEFAULT);  
  25.          UpdateWindow(hWnd);  
  26.          // Enter the message loop  
  27.          MSG msg;  
  28.          ZeroMemory(&msg, sizeof(msg));  
  29.          while(msg.message != WM_QUIT)  
  30.             {  
  31.                if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))  
  32.                   {  
  33.                      TranslateMessage(&msg);  
  34.                      DispatchMessage(&msg);  
  35.                   }  
  36.                else  
  37.                   {       
  38. //Do something to the screen  
  39.  }      
  40.       }  
  41.    // Unregister our window.  
  42.    UnregisterClass("AppClass", wc.hInstance);  
  43.    }  






發現大家都在留言中說要推薦一下游戲開發相關的書籍,我這裡就把各個階段(從零基礎開始)的推薦教程列出來吧,平時我寫這個系列的筆記就參考了下面的很多書籍,大家感興趣的話,可以深入去學習(推薦去買實體書,這樣就不用整天盯著電腦螢幕看傷害眼睛,健康是金錢買不來的):

第一階段,首先是C++的精通。推薦《C++ Primer》,之後《Effect C++》

第二階段,熟悉windows下的程式設計。推薦看《Windows程式設計》。

第三階段,Visual C++的學習。推薦的書目有孫鑫老師的《VC++深入詳解》和孫鑫老師的vc視訊教程。以及侯俊傑老師的《MFC深入詳解》,與時俱進的有尹成老師的《Visual C++2010開發權威指南》,但這本書推薦有一定的Visual C++基礎之後再看。
(第二階段和第三階段可以結合著來學習,有很多知識是相輔相成的,並沒有什麼大的界限。)

第四階段,開始學習專門介紹遊戲開發的教程(有DirectX和OpenGL兩條路可選,這裡我們選擇DirectX,DirectX在國內為主流。具體比較請移步最近剛寫的這篇文章 【Visual C++】遊戲開發筆記十九 DirectX與OpenGL的博弈),推薦書籍為《DirectX 9.0 3D遊戲開發程式設計基礎》(封面為一個紅龍的),《Windows遊戲程式設計大師技巧》,《Direct3D遊戲開發技術詳解》等等,當然這類教程就比較多了,新出的有很多,DirectX相關的層出不窮,也可以選擇剛發行不久的新書,畢竟上面講的知識比較前沿與更具成熟性。(依然感謝liusofttech  
的指出,為什麼我沒有推薦專門講解3D程式設計數學基礎的教程。我沒有專門指出來,是因為幾乎每一本Direct3D教材裡面都有一章到幾章有關必備數學基礎知識的講解。我覺得單獨來學數學基礎沒必要,費時且費力,我們只要在Direct3D教材裡掌握相關的數學知識,那就足夠了。)


還有什麼經典的書籍,歡迎大家交流補充~~
(有一位兄弟提到,《遊戲程式設計精粹》系列的書也比較經典,都是從事遊戲開發多年的全球頂尖遊戲工程師的肺腑之言,雖然經常會有個別錯誤- -,目前出了8本了,大家可以去看看)
 



以上就是本節筆記的全部內容。


更精彩的內容,且看後面的筆記系列。



感謝一直支援【Visual C++】遊戲開發筆記系列專欄的朋友們,也懇請大家繼續關注我的專欄。

【Visual C++】遊戲開發 系列文章才剛剛展開一點而已,因為遊戲世界實在是太博大精深了~

但我們不能著急,得慢慢打好基礎。做學問最忌好高騖遠,不是嗎?


淺墨希望看到大家的留言,希望與大家共同交流,希望得到睿智的評論(即使是批評)。

你們的支援是我寫下去的動力~


精通遊戲開發的路還很長很長,非常希望能和大家一起交流,共同學習,共同進步。

大家看過後覺得值得一看的話,可以頂一下這篇文章,你們的支援是我繼續寫下去的動力~

如果文章中有什麼疏漏的地方,也請大家指正。也希望可以多留言來和我探討相關的問題。

最後,謝謝你們一直的支援~~~



The end


相關文章