係統粉 > IT資訊 > 微軟資訊

微軟平台大型遊戲開發六步曲

發布時間:2017-04-04    瀏覽數:

微軟提供幾種編程語言可以寫Windows窗口應用程序,比如C/C++,VB,C#等。Windows下要學習遊戲窗口編寫,一定離不開Windows API的使用。

1、安裝窗口編譯環境

推薦VS(VS2008,VS2010,VS2015,VS2013,VS2017),MSDN文檔。

2、安裝幫助文檔MSDN

3、C/C++語言編程

4、掌握Windows編程

編寫Windows程序一般有兩種:一種是MFC編程(C++);一種是Win32編程(C+Windows API調用方式)。

5、窗口交互界麵

Windows編程兩部分:Windows下的交互界麵編程;深入理解Windows運行機製、內存管理和核心對象。

框架——Windows是一個消息驅動的係統

窗口——窗口管理,比如創建、銷毀、重繪、透明處理技術等

控件——包括Windows窗口上的各種控件的使用和管理。

外設——包括鼠標、鍵盤、打印機等、串/並口。

GDI——繪製各種Windows GDI對象,比如字體、位圖、畫筆、畫刷等

6、Windows核心編程

Windows內部運行機製。

內核對象——包括進程、線程、高度、同步等技術

內存管理——包括Windows係統的虛擬內存管理、地址空間、內存映射等

動態鏈接庫——包括動態庫原理、創建等

異常處理機製——結構化異常處理、異常鏈、錯誤與恢複。

二、Windows遊戲動作技能入門

微軟平台大型遊戲開發六步曲(1)

//---------------------------------------------------------------------------------------

//

// 程序名稱:Windows遊戲入門動作技能

//

// 編譯環境:Visual Studio 2013

//

// 文件名稱:Game.cpp

//

// 開發作者:張三

//

// 創建日期:2017-04-03

//

// 修改日期:2017-04-03 By 李四

//

//---------------------------------------------------------------------------------------

#include<Windows.h>

#include<tchar.h>

#pragmacomment(lib,"winmm.lib") // 調用PlaySound()函數所需要的庫文件

#defineWINDOW_WIDTH 800

#defineWINDOWS_HEIGHT 600

#defineWINDOW_TITEL L"Windows遊戲編程入門:動作技能"

// 聲明全局變量--------------------------------------------------------------------

HDC g_hdc = NULL, g_mdc = NULL; // 全局設備環境句柄/全局內存DC句柄HB

HBITMAP g_hSprite[12]; // 聲明位圖數組來存儲每一張人物的圖片

DWORD g_tPre = 0, g_tNow = 0; // 記錄上一次繪圖的時間/記錄本次準備繪圖時間

int g_iNum = 0; // 記錄目前顯示的圖片編號

// 聲明全局函數--------------------------------------------------------------------

LRESULTCALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // 窗口過程函數

BOOL Init_Game(HWND hwnd); // 資源初始化

VOID Paint_Game(HWND hwnd); // 繪製遊戲圖片

BOOL CleanUp_Game(HWND hwnd); // 清理資源

// WinMain():Windows應用程序的入口函數

intWINAPI WinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intnShowCmd)

{

// 窗口類

WNDCLASSEX wndclass = { 0 };

wndclass.cbSize = sizeof(WNDCLASSEX); // 設置結構體字節數大小

wndclass.style = CS_HREDRAW | CS_VREDRAW; // 設置窗口的樣式

wndclass.lpfnWndProc = WndProc; // 設置指向窗口過程函數的指針

wndclass.cbClsExtra = 0; // 窗口類附加內存,一船情況下直接取0即可

wndclass.cbWndExtra = 0; // 窗口附加內存,依然取0即可

wndclass.hInstance = hInstance; // 包含窗口過程的程序實例句柄

wndclass.hIcon = (HICON)::LoadImage(NULL, L"GAME.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);// 指定窗口類的光標句柄

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = NULL; // 用一個以空終止的字符串,指定菜單資源名稱

wndclass.lpszClassName = L"GameGDI";

// 注冊窗口類

if (!RegisterClassEx(&wndclass))

return -1;

// 創建窗口

HWND hwnd = CreateWindow(L"GameGDI", WINDOW_TITEL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,

CW_USEDEFAULT, WINDOW_WIDTH, WINDOWS_HEIGHT, NULL, NULL, hInstance, NULL);

// 顯示更新

MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOWS_HEIGHT, true);

ShowWindow(hwnd, nShowCmd);

UpdateWindow(hwnd);

// 遊戲資源初始化

if (!Init_Game(hwnd))

{

MessageBox(hwnd, L"遊戲資源初始化失敗", L"錯誤", 0);

returnFALSE;

}

PlaySound(L"仙劍·重樓.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);

// 消息循環

MSG msg = { 0 };

while (msg.message != WM_QUIT) // 使用while循環,如果消息不是WM_QUIT消息,繼續循環

{

if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) // 查看應用程序消息隊列,有消息時將隊列中的消息發出去

{

TranslateMessage(&msg); // 將虛擬鍵消息轉換成字符消息

DispatchMessage(&msg); // 分發一個消息窗口

}

else

{

g_tNow = GetTickCount();

if (g_tNow - g_tPre >= 100)

Paint_Game(hwnd);

}

}

// 窗口注銷

UnregisterClass(L"GameGDI", wndclass.hInstance);// 程序準備結束,注銷窗口類

return 0;

}

// 窗口過程函數

LRESULTCALLBACK WndProc(HWNDhwnd, UINTmessage, WPARAMwParam, LPARAMlParam)

{

switch (message)

{

caseWM_DESTROY: // 窗口銷毀消息

CleanUp_Game(hwnd); // 進行退出前的資源清理

PostQuitMessage(0); // 向係統表明線程有終止請求

break;

default:

returnDefWindowProc(hwnd, message, wParam, lParam);

}

return 0; // 正常退出

}

// 資源初始化

BOOL Init_Game(HWNDhwnd)

{

g_hdc = GetDC(hwnd);

wchar_t filename[20];

// 加載每個人物

for (int i = 0; i < 12; i++)

{

memset(filename, 0, sizeof(filename));

swprintf_s(filename, L"%d.bmp", i);

g_hSprite[i] = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 800, 600, LR_LOADFROMFILE);

}

g_mdc = CreateCompatibleDC(g_hdc); // 建立兼容設備環境的內存DC

Paint_Game(hwnd);

returnTRUE;

}

// 繪製遊戲圖片

VOID Paint_Game(HWNDhwnd)

{

if (g_iNum == 11) // 判斷是否超過最大圖片編號,若超過最大圖片編號10,則直接重新設置0

g_iNum = 0;

SelectObject(g_mdc, g_hSprite[g_iNum]);

// 把圖片按編號貼圖到窗口當中

BitBlt(g_hdc, 0, 0, 800, 600, g_mdc, 0, 0, SRCCOPY);

g_tPre = GetTickCount();

g_iNum++;

}

// 清除資源

BOOL CleanUp_Game(HWNDhwnd)

{

// 釋放資源對象

for (int i = 0; i < 12; i++)

DeleteObject(g_hSprite[i]);

DeleteDC(g_mdc);

ReleaseDC(hwnd, g_hdc);

returnTRUE;

}

這是今天的內容,希望大家有所收獲,學有所成,寫出屬於自己的程序!!!

如果對這方麵有興趣的可以加群:379249575,大家一起學習交流。

群內還有更多學習資料、視頻,免費課......

上一篇:安卓超越微軟成最大係統 但穀歌還有更大野心 下一篇:微軟PC係統37年首次被安卓手機打敗,蓋茨都攔不住

相關資訊

最新熱門應用

電腦問答