教孩子寫遊戲:手寫一個最最簡單的Windows程序框架

2021-01-08 我是遊戲小胡

「學」的部分

如果你認真學習了第6節的內容,那麼,現在你已經成功安裝好了C++的工作環境,也就是Visual C++的某一個版本。你不用把這個集成工作環境想像地那麼難,覺得編程很高大上,然後覺得這個軟體也很高大上。如果這樣想的話,你就很難教好孩子了。編程的高難度時代已經過去,各種各樣的底層技術難題已經被我們的前輩們解決,而且很好地封裝到了各種各樣的函數中,我們只要懂得如何去使用就可以了。這一節課,我們就用這個集成工作環境寫一個Windows程序的框架。

首先,我們看一看Windows程序框架的完整原始碼:

#include <windows.h>#include <windowsx.h>#include <tchar.h>//函數聲明LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//入口函數int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd){//首先定義Windows類WNDCLASSEX w;LPCTSTR wn = _T("我的第一個Windows程序");//賦值w.cbSize = sizeof(WNDCLASSEX);w.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;w.lpfnWndProc = (WNDPROC)WndProc;w.cbClsExtra = 0;w.cbWndExtra = 0;w.hInstance = hInstance;w.hIcon = LoadIcon(hInstance,NULL);w.hCursor = LoadCursor(NULL,IDC_ARROW);w.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);w.lpszClassName = wn;w.hIconSm = LoadIcon(hInstance,NULL);w.lpszMenuName = NULL;//註冊類RegisterClassEx(&w);//創建窗口if (!CreateWindowEx(NULL,wn,L"第一個程序",WS_OVERLAPPEDWINDOW | WS_POPUP | WS_VISIBLE,0,0,800,600,NULL,NULL,hInstance,NULL))return 0;//消息循環bool got;MSG msg;PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );while (WM_QUIT != msg.message){got = ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) != 0 );if(got){if (!TranslateAccelerator(msg.hwnd,NULL,&msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}else{//這裡是以後渲染遊戲的位置/*就是這裡,下面的Sleep語句是單獨的*/Sleep(1);}}return (int)msg.wParam;}LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){HRESULT r = 0L;//開始處理消息switch(msg){case WM_CLOSE:case WM_DESTROY:PostQuitMessage(0);break;}return DefWindowProc(hWnd, msg, wParam, lParam);}

我一上來就拿出大段的代碼,並不是要嚇唬你們,而是因為Windows編程的框架本就比較複雜,像上面這樣的代碼已經簡化了非常多了。而且,只要你認真看完我的解釋,理解這些代碼並不是什麼難事。

為了有一個直觀的印象,我們先用編譯器(也就是那個集成工作環境)來編譯運行一下我們的這個框架。

由於沒有強制性,你下載的Visual Studio版本可能不太一樣,但是操作是差不多的。總得來說分成3步:(如果你是第一次打開Visual Studio,請選擇C++為主要設計語言)

第1步,創建一個新的項目,創建的過程就是在「文件」的「新建」下面選擇「項目」。由於我們要寫的是Windows程序,請選擇「Win32」項目右側的「Win32 項目」,然後自定義一個名稱,再點擊確定就可以了;

然後會有對話框彈出,一般選擇下一步就可以了,在「應用程式設置」中,選中「空項目」然後點完成。

為什麼要創建「空項目」呢?因為遊戲程序是一個相對消耗系統資源的程序。

Visual Studio是為了方便程式設計師編程用的,所以,它能主動生成各種各樣的程序框架,而我們這一節所講的Windows框架也是可以自動生成的。在Visual C++中,這個Windows框架被稱為MFC,是一個非常強大的、微軟提供Windows框架程序。但是,像MFC這樣強大又複雜的Windows框架反而不適合用來寫遊戲程序,因為這些框架功能太強大,而且封裝得太厲害,會嚴重影響最終程序的效率。為了讓遊戲程序能更好地使用計算機的資源,我們要手寫一個最最簡單的Windows框架。

第2步,是要添加一個CPP類型的文件,然後把上面的代碼複製進去。在項目創建完成後,我們就能看到「解決方案資源管理器」,其中就有我們剛創建的項目。只要右擊項目名稱,就能添加CPP文件了。具體的方法,是在右擊菜單中選擇「添加」下面的「新建項」,一般會自動選擇CPP文件,我們只需要輸入文件名稱就能創建了。

創建成功後,這個CPP文件會自動打開,不過暫時裡面什麼都沒有。你想要看效果,就把上面的代碼一字不差地複製進去就可以了。如果你想加深印象,可以試著手動輸入所有的代碼,也就是抄一遍(我個人建議你抄一遍比較好,編程不能一蹴而就,是一個慢慢磨的過程)。

第3步就比較簡單了,直接在「生成」菜單下選擇「生成解決方案」,編譯器就能自動幫你編譯好程序了。只要你沒有輸入錯誤,編譯是一次性通過的。然後,在「調試」下面選擇「開始執行(不調試)」就能直接運行你剛寫的這個程序了。正常來說,桌面上會彈出一個白色的窗口,窗口中一片白,啥都沒有。這個窗口就是Windows的框架,而裡面的白色就是我們後期需要添加素材的地方。

接下來,我們仔細解釋一下這些代碼。

如果你第6節內容學得非常紮實的話,其中的12個概念全部都了如指掌,那麼,上面這一段代碼你是可以看出個大概的。起碼的,你知道變量、注釋、結構、函數和while循環,你不知道的,僅僅是這些代碼為什麼要這樣組織起來罷了。

所以,我在這裡假定,你的第6節內容學得非常紮實,這樣我就能把更多深層次的東西說出來了。如果你認為自己在第6節只是走馬觀花的話,強烈建議你回過頭去好好把第6節的內容學紮實了,否則的話,接下來的內容你可能會看不懂。

一、開頭包含「#include」的3行

在第6節內容中,我們所講解的只是C++語言的一些重要知識點,理解了之後,你就可以看明白大部分的C++代碼,但不代表能看懂。在C++中,這些知識點是以語句的形式存在的,而C++中大致分成兩類語句:帶分號的語句和不帶分號的語句。

所謂帶分號,也就是帶符號「;」的語句(記住,是英文字符),是C++中主要的語句。你可以看上面的例子,你能找到大量的分號,這個符號代表了一個語句的結束。你只要記住,凡是有「;」的語句,只有找到「;」才算一個語句的結束。比方說上面語句中創建窗口的函數CreateWindowsEx並沒有寫在一行,而是分成了很多行來寫,最後在「return 0」後面加上了「;」,也就是說,這麼多行加起來才算是一個語句。

第二類就是這裡說的3行不包含「;」的語句,這類語句的特徵是以「#」開頭,在C++中的術語是「預編譯語句」。我們不需要了解那麼多,隨著你的編程深入,你自然而然就會懂得很多事情。在這裡,我們只需要知道,這裡的三行「#include」代表的是「包含」的意思。我們看「<>」中間的內容,明顯是一個.h類型的文件,這類文件是C++語言中的頭文件。一般的頭文件都是聲明文件,裡面包含了大量的聲明語句。說得再簡單些,這些.h文件中包含了前輩們的編程成果,而我們想要快速編程,就要用到這些編程成果。所以,我們寫這3行語句的目的,是為了告訴編譯器,我們寫的這個程序需要用到這裡指定的一些「編程成果」。

你還可以這樣理解:.h中是一些前輩們製作好的功能,而我們自己的程序中「包含」這些.h文件,就能在我們的程序中使用這些前輩們的功能了。如果我們不包含這些.h文件,下面代碼中的各個函數將會無法使用。

二、函數聲明部分

這裡的函數聲明只有WndProc這麼一個函數。我們在第6節中學習的函數都只有一個前綴,而這裡的函數有兩個前綴——LRESULT和CALLBACK。我們還是初學者,我們只需要知道,這是Windows編程中獨特的回調函數聲明方式。什麼是回調函數?如果你上一節,也就是第8節認真學了的話,就會知道,Windows系統的核心是消息,一切都是為了消息服務的。而這裡聲明的這個WndProc函數,就是專門處理Windows消息用的,這下你應該明白了吧?

三、入口函數

在第8節中我們已經簡要說過了Windows的工作原理,而我們的編程也是在Windows大環境下進行的,所以,所有的Windows程序都是由兩部分組成的:第一,是程序的功能實現部分;第二,是消息的處理部分。

相關焦點

  • 教孩子寫數字1到10竅門 如何教孩子學寫數字
    可以教給孩子一個順口溜,能讓孩子認識數字不說,在腦海裡還能形成畫面,口訣:1像鉛筆細又長,2像小鴨水上漂,3像耳朵聽聲音,4像紅旗迎風飄,5像秤鉤來買菜,6像哨子嘟嘟叫,7像鐮刀割青草,8像葫蘆擰一遭,9像氣球飛上天,10像火腿加雞蛋。
  • 教孩子寫遊戲:重要的基礎知識,簡要理解Windows系統的工作原理
    由於DOS系統只是提供了最最基礎的功能,所以DOS系統的功能不多,其中最大的弊端就是——無法同時運行多個程序。我們現在用的Windows系統,同時運行程序的數量是沒有限制的,你可以在打字的同時聽歌,還能在後臺下載喜歡的電影,甚至還可以掛機各種各樣的遊戲。而DOS系統為什麼不能同時運行多個程序呢?主要是因為DOS系統沒有開發這個功能。
  • C語言編寫Windows下的實用程序:[1]對話框
    相信很多C語言初學者,都會有一種困惑,C語言的教程、教材上面很多是對C語言的語法和算法講解,而沒有教大家做一些真正可以用到的程序,從而質疑C語言到底是否足夠牛X,能夠開發出炫麗多彩的遊戲嗎;對C語言的可用性、易用性、強大產生懷疑。
  • 百度輸入法整合手寫輸入方式,「自由寫」模式迎來新升級
    雖然目前多數人都會使用拼音輸入,但對於中老年用戶而言,手寫是最常用也是最易用的輸入方式,但由於使用智慧型手機的中老年人群體不夠龐大,人們對於這個群體在智能設備的使用方面也不夠重視,間接對手機輸入法的手寫輸入模式也並不熟悉,甚至有些輸入法都沒有提供「手寫模式」。
  • 教孩子寫遊戲:3D遊戲編程的必備數學知識,理解三維空間向量
    因為我們要寫的是3D遊戲程序,所以,我們必須要接觸兩個數學方面的難點知識——向量和矩陣。有的人問:這個這麼難,我們可不可以不學?我的答案是這樣的:如果你是有心要學習本課程,那麼這個是必須要學習的,是沒有道理可講的,是想破了腦袋也要學明白的。
  • 如何製造一個簡單的2D遊戲?
    前言本文主要介紹的是我在參加學校工作室考核(是的)時開發一個簡單的2D橫板跳躍遊戲時的一些思路和開發記錄,如果你對遊戲開發比較感興趣並且想成為一個遊戲開發者的話,這篇文章或許對你會有一些幫助!如果你是一個遊戲開發者的話歡迎來和我交流:D!
  • 26個英文字母雖簡單,手寫體仍容易犯錯
    從小學一年級開始,我們便已經在老師的監督下開始學習26個字母的發音、苦背ABCD,以及反覆抄寫……但是學習這麼多年,這麼簡單的英文字母,我們真的書寫對了嗎?26個英文字母雖簡單,但手寫體仍很容易犯錯。在看到學生們的作文時,以下的問題很常見。如大寫的G、J、U等,很多同學寫的是印刷體的字母,非手寫體的正確形式。出現下圖左邊印刷體書寫的情況,老師們在評卷的時候,是會被扣分的喲。
  • 教孩子寫遊戲:矩陣在3D遊戲編程中是如何被使用的?
    在電腦上運行3D程序,就好比是在路上開車。而矩陣,就相當於是一個額外的氮氣加速器。假設,在沒有矩陣的情況下,車子只能開10碼,那麼,有了矩陣之後,車子就能開到200碼的樣子了。在程式設計師使用矩陣之前,他們也不知道計算機在處理矩陣的時候那麼給力,所以,這應該算是一個意外之喜吧?好了,大致了解了前因後果之後,我們來看一看矩陣在3D遊戲編程中到底怎麼用吧。
  • 開發孩子大腦最簡單最有效的方法——誦讀經典
    因為「先天中確立後天最易」,0—3歲是孩子們最初始的「先天中的後天起步階段」,它決定著孩子人生之旅的一生是否成功,能否實現父母的殷切期望。現在大多家長老師要求孩子先理解再記憶,這是一種左腦式教育,是把成人的左腦思維方式強加於孩子,在抹殺孩子的天賦而全然不知。右腦記憶是不需要理解的,右腦屬於深層次的悟解。
  • 教孩子寫遊戲:3D遊戲編程離不開矩陣,我們要如何理解矩陣?
    這麼說吧,如果你對矩陣一無所知,那麼,整個3D遊戲編程你是學不懂的。你可以靠著強大的記憶力把本課程的代碼記住,並且也能通過自己的摸索寫出類似的3D遊戲來,但是,你對其中的原理是不理解的,將來想要寫功能更強大的3D遊戲,就純粹是天方夜譚了。但是,擺在我面前的難題是:一個成年人想要學習矩陣都有點困難,如何讓小孩子也明白矩陣的一些道理呢?
  • 英文字體怎麼寫最好看,5分鐘教你寫N種又Q又可愛的手寫字
    今天我要跟大家分享的是寫手帳用的很Q,很可愛的手寫字,今天我們先來寫英文的。先寫一個come on,你可以用鉛筆打一下草稿再描成空心的。再寫一個大氣一點的,如果想要這個字寫的有氣勢呢,就儘量把拐角的地方寫的比較尖銳的角。
  • 歷代Windows系統哪個讓你最難忘?1.0到10的漫漫歲月
    和傳統的linux以及DOS等作業系統不同,微軟的Windows作業系統的最大特點就是「可視化」及「簡單易操作」。無論你是否承認,這種特點使得家用電腦PC真正的成為每一個普通人在生活中能夠學會使用的工具,而不僅僅只作為實驗室中,或者是電腦高手的專屬「寵物」。從Windows誕生的一刻起,就為如今這個咱們這個信息化社會的產生奠定了真正的基礎。
  • 2016上半年最有發展前景的5款框架
    下面我們就為大家來推薦一下2016上半年最有趣也是最有發展前景的5款框架。是完全用JavaScript來寫的話,那麼就可以在伺服器和客戶端之間進行無差異的同時調用。  Meteor是一個開源的JavaScript框架,基礎框架是Node.js,側重於實時Web應用程式。使用Meteor會讓你產生一個感覺,那就是瀏覽器的刷新按鈕和地址欄都是多餘的,因為伺服器和瀏覽器每一次的數據增刪改查都會自動同步推送到伺服器和每一個客戶端,不需要刷新頁面來查看新內容。  Meteor框架通過移除一些不必要的程式語言從而簡化了開發過程。
  • 很多古老的經典DOS遊戲,WINDOWS運行不了?一個軟體幫你解決
    這裡讓我來教大家一個更簡單更方便的方法來解決這個問題吧。這裡以我WIN10上的1996年的《金庸群俠傳原版》為例來教大家如何進行吧。正常操作打開遊戲主程序,系統提示「此應用無法在你的電腦上運行」。那要怎麼辦呢?一、準備一個軟體——DOSBOX。軟體下載下來後,運行,會出現兩個命令框。二、在那個小命令框下輸入指令。
  • 教孩子寫遊戲:計算機到底是個什麼玩意兒?如何簡單地理解電腦?
    不管是任何的計算機功能,在我們看不到的背後,全部都是最簡單的數學計算,只不過,這個計算的速度非常非常快。我們學習編程,目的是讓電腦按照我們腦子裡的構想來計算不同的加法,然後電腦就能表現出不同的功能了。這樣你就能明白前面的話了:沒有任何程式設計師能不依靠前人的成果進行編程。
  • React、Angular和Vue三種最流行的前端框架哪一個最好?
    這是三種最流行的工具,可以幫助開發人員構建Web應用程式。仔細閱讀,看哪一個最適合您的需求。在當今的發展世界中,技術發展非常迅速並且變化迅速,許多開發工具似乎可以解決不同的開發問題。在本次討論中,我們將比較三種最受歡迎的前端開發技術 - Angular,React和Vue。我們正在根據項目架構或者從開發人員的角度來討論這種比較,他們將為新項目選擇技術。
  • Lingumi:如何用立方體玩具與肢體、遊戲教不同年齡段的孩子學英語
    當時你是最天生的語言學習者,但是我們需要應用一些學習方法,不管是幼兒園還是老師還是家長,他們都要學習這些方法,訓練自己。然後教他們的孩子,當你四五六歲的時候讓他們就開始學習。我們就建立了這樣一些電子課程,還有一些學術教學方法,讓這些兩三歲或者是四五歲的孩子加入進來,開始學習英語,我們會有非常有結構化的研究教育體系。我們通過遊戲化的方式來教育孩子。」
  • 「乾貨收藏」孩子最簡單易學的10首英文歌!
    美國一項最新研究顯示,學習第二語言的黃金時期是從出生到7歲,大腦在這個階段最易接收第二語言的聲音和模式。父母還可以教孩子邊唱邊用手指指向頭、肩膀、膝蓋等部位,使寶寶在快樂中學習和感知兒歌內容,真正做到「育教於動」、「育教於樂」。剛開始唱的時候節奏可以慢一些,因為要連貫地做一系列動作,對寶寶來說實在是一件不大容易的事情。等寶寶動作協調了以後,可以越唱越快,非常有趣。這個帶有唱歌方式的遊戲極大地鍛鍊了寶寶身體動作的協調性,而且寶寶也能很快記住他身體這幾個部位的英語名稱哦。
  • 2016年7款最流行的Java框架
    【IT168 評論】雖然Java一直被唱衰,但是直到現在Java也堅持霸主地位不動搖,毫無疑問,Java是目前最熱門的程式語言之一,所以我們為大家搜集了一些目前比較受歡迎的Java框架的消息。
  • 數學怎樣學最簡單?淺談初中數學快速而紮實地提升計算能力的方法
    上小學的時候我就聽說過達文西畫蛋的故事,達文西的老師費羅基俄給他上的第一課就是教達文西怎樣將雞蛋畫得各具形態,惟妙惟肖。經過三年的努力,通過數千個雞蛋的練習,達文西對色彩的感覺敏感了,線條的把握準確了,手中的畫筆也能絕對服從自己的意志。我聽到這個故事之後很長時間都覺得不可置信,如此單一的教法能成功地培養出優秀的孩子嗎?