3D遊戲引擎一 win32程式設計

2021-09-08 18:04:46 字數 2786 閱讀 8408

windows程式一般都等待使用者進行一些操作,然後響應並採取行動。

一般來說。對win32的程式的操作都會轉換為系統事件佇列中的訊息,如按鍵訊息wm_keydown,wm_mouseclick等傳遞鍵盤以及滑鼠的操作訊息。

系統訊息傳遞給程式的本地事件佇列。然後在傳遞給winproc()函式進行主窗體的訊息處理,處理完訊息後。程式轉到winmain()主函式中,而此時一般主函式依舊在進行訊息迴圈,於是又等待新的訊息並執行。

win32的程式都是有winmain開始,最簡單的乙個win32程式。從空專案開始:

#define win32_lean_and_mean             

#include int winapi winmain(hinstance hinstance,

hinstance hprevinstance,

lpstr lpcmdline,

int ncmdshow)

winmain 函式

messagebox()函式

sdk中乙個簡單的提示聲音的函式 messagebeep(uint utype),引數值utype經常使用的有 mb_ok 系統預設聲音,當然假設你將計算機系統中的系統聲音設定為無聲,就聽不到聲音的。

從乙個空專案開始建立乙個完整的windows程式的步驟:

建立乙個windows類。

建立乙個事件處理程式winproc

向windows註冊建立的windows類:定義了windows類後,還要通過註冊,讓windows作業系統知道這個類,註冊通過函式 registerclas***()來完畢。接收乙個指向windows類的指標作為引數。

呼叫政策函式之前,windows系統還不知道有這個類,因此不能使用新的類名來引用它,而是用但錢儲存的類的實際資料結構來進行註冊。

使用windows類建立乙個窗體

建立乙個主事件迴圈,用於接收windows訊息並將其傳送給事件處理程式。

最後。乙個簡單的空白win32專案**例如以下:

//不載入mfc

#define win32_lean_and_mean

#include #include //windows類類名常量

const char* myclassname = "winclass";

//訊息處理函式

lresult callback wndproc(hwnd hwnd,

uint msg,

wparam wparam,

lparam lparam)

break;

case wm_paint:

break;

case wm_destroy:

break;

default:

return (defwindowproc(hwnd,msg,wparam,lparam));

} return (0);

}//主函式

int winapi winmain(hinstance hinstance,

hinstance hprevinstance,

lpstr lpcmdline,

int ncmdshow)

//建立窗體

0, 0, 400, 500, null, null, hinstance, null) ) )

//進入主迴圈

while( getmessage(&msg,null,0,0) )

//返回到作業系統

return msg.wparam;

}

但這為一般程式的基本結構。對於遊戲。要構建乙個實時事件迴圈,使其既能進行遊戲邏輯處理,比如乙個game_main()函式,又能實時檢測訊息佇列中的訊息並處理。

這裡就要構建乙個實時事件迴圈,使用函式peekmessage ()  來檢測訊息佇列中是否有訊息。

假設有。對其進行處理。否則繼續處理其它遊戲邏輯並反覆迴圈。peekmessage 函式原型例如以下:

bool peekmessage(

lpmsg ipmsg, //訊息 的指標

hwnd hwnd,//窗體控制代碼

uint wmsgfiltermin,//第一條訊息

uint wmsgfiltermax,//最後一條訊息

uint wremovemsg//刪除標記

);

一般第一條訊息和最後一條訊息都設為0。而刪除標記有三種:

pm_noremove

peekmessage處理後,訊息不從佇列裡除掉。

pm_remove

peekmessage處理後。訊息從佇列裡除掉。

pm_noyield

此標誌使系統不釋放等待呼叫程式空暇的執行緒。可將pm_noyield任意組合到pm_noremove或pm_remove。

pm_noremove或pm_remove是基本的標記,若使用不刪除訊息,就要配合getmessage()來獲得訊息進行處理。若使用pm_remove。則直接使用peekmessage獲得訊息,相應的實時事件迴圈**例如以下:

while(true)

//主遊戲處理邏輯

game_main();

}

這裡主遊戲處理邏輯必須有返回,即生成乙個動畫幀或執行了一段遊戲邏輯後必須返回。

3D遊戲引擎系列一

筆者介紹 姜雪偉,it公司技術合夥人,it高階講師,csdn 社群專家,特邀編輯,暢銷書作者,國家專利發明人 已出版書籍 手把手教你 架構 3d遊戲引擎 電子工業出版社 和 unity3d 實戰核心技術詳解 電子工業出版社等。為了能讓開發者重視引擎開發,最近一直在寫一些關於學習引擎的一些博文,為此還...

3D手機遊戲引擎

一,寒霜2引擎 frostbite 2 engine 但手機上貌似不支援 二,虛幻3引擎 unreal engine 3 沒用過 三,unity 引擎 本人使用過 以上3d引擎我推測應該都是基於 opengl es2.0圖形庫支援嵌入式裝置。2d手機遊戲引擎 一,cocos2d x cocos2d ...

3D遊戲引擎系列四

筆者介紹 姜雪偉,it公司技術合夥人,it高階講師,csdn社群專家,特邀編輯,暢銷書作者,國家專利發明人 已出版書籍 手把手教你架構3d遊戲引擎 電子工業出版社和 unity3d實戰核心技術詳解 電子工業出版社等。在設計引擎時,首先我們要做的是把整個引擎的框架設計好,引擎設計採用的都是模組化開發,...