時間: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遊戲動作技能入門
//---------------------------------------------------------------------------------------
//
// 程序名稱: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,大家一起學習交流。
群內還有更多學習資料、視頻,免費課......