一个游戏的使用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);//游戏资源初始化,若初始化失败,弹出有一个消息框,并返回FALSEif (!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_DESTROYbreak;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));elseg_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游戏编程之从零开始》,希望自己可以把这本书学完,加油!

记录windows游戏编程——1相关推荐

  1. 【逐梦旅程Windows游戏编程学习笔记 ①】基本GDI绘图

    近半年各种忙碌,一直没写博客,现在得空学习记录一下,原书为<逐梦旅程 Windows游戏编程之从零开始>毛星云编著 实现样式与功能: 实现功能: 1,显示title:"致我们.. ...

  2. Windows游戏编程快速入门方法

    Windows游戏编程快速入门方法 Easideao(简单思路) 序言: 从2001年到2005年,在不知不觉中我已经渡过了4年的职业游戏开发生涯.在这4年里经常会有些网友向我询问编程的入门有没有捷径 ...

  3. 《Windows游戏编程大师技巧》(第二版)第1章(上)

    第1章 学海无涯 "Oh, you want some too?!?" -Hudson, Aliens Windows 编程就像是一场由来已久并还在进行着的战争.尽管游戏程序员曾经 ...

  4. Windows游戏编程大师技巧(一)

    第一章 无尽之旅 Windows编程是一场由来已久并还在进行着的战争.开始时,游戏程序拒绝Windows平 台,但正如Borg所言:"反对无效......",我也赞同这一观点.本章 ...

  5. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

  6. 【浅墨著作】 逐梦旅程 Windows游戏编程之从零开始 勘误 配套源代码下载

    这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来浅墨的博客逛一下看有没有更新,"每天都来就像看女神那般不依不舍", ...

  7. 开始利用CSDN做学习笔记,从windows 游戏编程大师技巧和3D游戏编程大师开始

    利用两个月的空余时间将windows 游戏编程大师技巧和3D游戏编程大师技巧看了一遍. 第一遍读的并不深入,代码也没有仔细研究.特别是3D下册,基本只是草草浏览了一遍而已.这一遍是为了对整体有个印象和 ...

  8. 《Windows游戏编程大师技巧》(第二版)第2章

    因此几乎是一夜间,Windows 95就改变了整个计算机行业.的确,目前还有一些公司仍然在使用Windows 3.1(你能相信吗?),但是Windows 95使得基于Intel的PC成为除游戏之外的所 ...

  9. 《Windows游戏编程大师技巧》三、Windows高级编程

    Windows编程很绝的地方在于:你不用了解太多细节,就可以完成很多工作. 使用资源 资源就是你的程序代码结合在一起的多块数据,可以被程序本身在运行时加载. 资源应当也放在程序的.EXE文件中的原因是 ...

  10. 《Windows游戏编程大师技巧》(第二版)第11章

    第三部分:核心游戏编程   第11章 算法.数据结构.内存管理和多线程   第12章 人工智能   第13章 游戏物理   第14章 文字时代   第15章 综合运用:编写游戏! 第11章 算法.数据 ...

最新文章

  1. pypypy python_聊聊Python中的pypy
  2. torchvision中Transform的normalize
  3. 无表头单链表的总结----输出链表
  4. 数据结构之树的定义及操作
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的二手电动车交易系统
  6. mdk 加static会被优化吗_网站关键词排名优化你会吗?深圳龙岗网络外包公司讲解...
  7. 震旦adc225打印机连接计算机,震旦ADC225打印机驱动
  8. Java中的拦截器和过滤器有什么区别
  9. ffmpeg实例,drawtext在视频上添加文字
  10. mro python_Python-MRO
  11. c语言赋值语句逗号,C++中赋值运算符与逗号运算符的用法详解
  12. css 属性 position:sticky (粘滞的) 制作导航吸顶效果
  13. FreeRTOS个人笔记-初谈CM3内核
  14. mysql qcow2_如何创建qcow2格式的磁盘镜像并填充数据?
  15. 这么骚的SQL进阶技巧,不怕被揍么?
  16. java获取密钥长度_#1071 - 指定密钥太长;最大密钥长度为767字节
  17. Python基础-list和tuple使用
  18. 锦城学院和锦江计算机,四川大学锦城学院怎么样_是几本?和四川大学锦江学院哪个更好?...
  19. 如何跟进团队的沟通、协作和执行?这款团队协作软件你得试试
  20. [译]基于深度残差学习的图像识别

热门文章

  1. 杭州爱华科技“AWA5661”噪音采集软件
  2. 博弈论基础之sg函数与nim
  3. 五、瞰景Smart3D空三解算
  4. wsdl2java validate_使用cxf wsdl2java进行客户端证书身份验证
  5. 最新实用油猴脚本推荐
  6. 去掉CAD打印时出现由AUTODESK教育版产品制作戳记的方法
  7. 批量处理文件内容数据
  8. AI十大数据挖掘算法
  9. windows如何安装pycharm2022版本?pycharm如何安装汉化语言包{www.423zy.com}
  10. jquery queue ajax,插件 jQuery ajaxQueue 中文API文档