记录windows游戏编程——1

一个游戏的使用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游戏编程之从零开始》,希望自己可以把这本书学完,加油!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值