一个游戏的使用DirectX的简单绘图框架
//程序名称:GameCore
//2020年5月10日
//用代码勾勒游戏开发所需要的程序框架
#include <windows.h> //宏
#include <time.h>
#define WINDOW_HEIGHT 600
#define WINDOW_WIDTH 800
#define WINDOW_TITLE L"[致我们永不熄灭的游戏开发梦想]程序核心框架"
//全局变量
HDC g_hdc = NULL; //全局设备环境句柄
HPEN g_hPen[7] = { 0 }; //定义画笔句柄数组
HBRUSH g_hBrush[7] = { 0 }; //定义画刷句柄数组
int g_iPenstyle[7] = { PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL, PS_INSIDEFRAME };
//定义画笔样式数组并初始化,实线,虚线,点,线点,线点点,空白,封闭形状内线
int g_iBrushStyle[6] = { HS_VERTICAL, HS_HORIZONTAL, HS_CROSS, HS_DIAGCROSS, HS_FDIAGONAL, HS_BDIAGONAL };
//定义画刷样式数组并初始化,垂直阴影,水平阴影,水平垂直交叉线阴影,45°交叉线阴影,45°向下对角线阴影,45°向上对角线阴影
//声明
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL Game_Init(HWND hwnd);
VOID Game_Paint(HWND hwnd);
BOOL Game_CleanUp(HWND hwnd);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) //WinMain应用程序入口函数
{
//窗口创建第一步:设计一个完整的窗口类
WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX定义了一个窗口类
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"icon.ico", IMAGE_ICON, 0, 0,
LR_DEFAULTSIZE | LR_LOADFROMFILE); //本地加载自定义ico图标
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //指定窗口类的光标句柄
wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //为hbrBackground成员指定一个灰色画刷句柄
wndClass.lpszMenuName = NULL; //用一个一空终止的字符串,指定菜单资源的名字
wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //用一个一空终止的字符串,指定窗口类的名字
//窗口创建第二步:注册窗口类
if (!RegisterClassEx(&wndClass)) return -1; //创建了窗口必须要注册,窗口类才可以用。
//窗口创建第三步:正式创建窗口
HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOW_TITLE,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
//窗口创建第四步:窗口的移动、显示与更新
MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);
ShowWindow(hwnd, nShowCmd);
UpdateWindow(hwnd);
//游戏资源初始化,若初始化失败,弹出有一个消息框,并返回FALSE
if (!Game_Init (hwnd))
{
MessageBox(hwnd,L"资源初始化失败",L"消息窗口", 0);
return FALSE;
}
//消息循环过程
MSG msg = { 0 };
while (msg.message != WM_QUIT) //如果消息不是WM_QUIT消息队列,就继续循环。
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) //查看应用程序消息队列,有消息时将队列中的消息派发出去
{
TranslateMessage(&msg); //将虚拟键消息转换为字符消息
DispatchMessage(&msg); //分发一个消息给窗口程序
}
}
//窗口类注销
UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance);
return 0;
}
//窗口过程函数WndProc
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) //窗口过程函数
{
PAINTSTRUCT paintStruct; //定义一个PAINTSTRUCT结构体来记录一些绘制信息
switch (message)
{
case WM_PAINT: //客户区重绘消息
//Direct3D_Render(hwnd); //进行画面的绘制
g_hdc = BeginPaint(hwnd, &paintStruct); //准备绘图工作,并将和绘图有关的信息填充到paintStruct中
Game_Paint(hwnd);
EndPaint(hwnd, &paintStruct);
ValidateRect(hwnd, NULL); //更新客户区的显示
break;
case WM_KEYDOWN: //键盘按下消息
if (wParam == VK_ESCAPE) //ESC键
{
DestroyWindow(hwnd); //销毁窗口
}
break;
case WM_DESTROY: //窗口销毁信息
//Direct3D_CleanUp(); //清理COM接口对象
Game_CleanUp(hwnd); //调用自定义的资源清理函数Game_CleanUp()进行退出前的资源清理
PostQuitMessage(0); //向系统表明有个线程有终止请求,WM_DESTROY
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam); //调用默认的窗口过程函数提供默认处理
break;
}
return 0;
}
//Game_Init()函数
BOOL Game_Init(HWND hwnd)
{
g_hdc = GetDC(hwnd); //获取设备环境句柄
srand((unsigned)time(NULL)); //初始化时间种子
//随机初始化画笔和画刷的颜色值
for (int i = 0; i <= 6; i++)
{
g_hPen[i] = CreatePen(g_iPenstyle[i], 1, RGB(rand() % 256, rand() % 256, rand() % 256));
if (i == 6)
g_hBrush[i] = CreateSolidBrush(RGB(rand() % 256, rand() % 256, rand() % 256));
else
g_hBrush[i] = CreateHatchBrush(g_iBrushStyle[i],RGB(rand() % 256, rand() % 256, rand() % 256));
}
Game_Paint(hwnd);
ReleaseDC(hwnd, g_hdc);
return TRUE;
}
//Game_Paint()函数
VOID Game_Paint(HWND hwnd)
{
//定义一个y坐标值
int y = 0;
//一个for循环,用7种不同的画笔绘制线条
for (int i = 0; i <= 6; i++)
{
y = (i + 1) * 70;
SelectObject(g_hdc, g_hPen[i]); //将对应画笔选好
MoveToEx(g_hdc, 30, y, NULL); //"光标"移动到对应的(30,y)坐标处
LineTo(g_hdc, 100, y); //从(30,y)向(100,y)绘制线段
}
//注意上面画完之后由420,下面画矩形的时候还有用
//定义两个x坐标值
int x1 = 120;
int x2 = 190;
//用7种不同的画刷填充矩形
for (int i = 0; i <= 6; i++)
{
SelectObject(g_hdc, g_hBrush[i]); //选用画刷
Rectangle(g_hdc, x1, 70, x2, y); //画一个封闭的矩形
x1 += 90;
x2 += 90;
}
}
//Game_CleanUp()函数
BOOL Game_CleanUp(HWND hwnd)
{
//for循环,释放掉所有的画笔和画刷句柄
for (int i = 0; i <= 6; i++)
{
DeleteObject(g_hPen[i]);
DeleteObject(g_hBrush[i]);
}
return TRUE;
}
运行结果如下:
花了不少时间整理,来自于《逐梦旅程 Windows游戏编程之从零开始》,希望自己可以把这本书学完,加油!