发布时间:2026/8/16 6:01:21
纯WINDOWS API的C++2D小游戏Subterra(目前还未开发,实时更新) 运行方式Visual Studio (请拥有“使用 C 的桌面开发”工作负载)下载方式https://visualstudio.microsoft.com/zh-hans/dowloads/若上述方法不行请在 Microsoft Store 内尝试搜索 Visual Studio Community 并下载请启动VS建议使用VS2026创建新项目 Windows 桌面应用程序 输入项目名称 创建右键“源代码” 新建 main.cppmain.cpp源代码#includewindows.h#includegdiplus.h#pragmacomment(lib,gdiplus.lib)#defineCLASS_NAMELSubterra#defineWINDOW_WIDTH800#defineWINDOW_HEIGHT512#defineICON_WIDTH32#defineICON_HEIGHT32#defineFDS_MS16structPLAYER{intX400;intY256;intWidth14;intHeight20;doubleG80;doubleStart_Jump_Speed60000;doubleMove_Speed24000;doubleJump_Speed0;boolIs_Jumpingfalse;intMoving0;//0sat, 1left 2rightboolIs_Squatingfalse;boolGame_Overfalse;boolKeys[95]{false};}Player1;HWND hWnd;HINSTANCE g_hInstance;HDC hPlayerDC;HBITMAP hBitPlayer;intMap[WINDOW_WIDTH/16][WINDOW_HEIGHT/16]{0};HBITMAPCreateTransparentMask(HDC hMemDC,intWidth,intHeight);HICONCreateTransparentIcon(intWidth,intHeight);voidInitGraphics(HDC hdcScreen);voidCleanupGraphics();voidDrawCharacter(HDC hdcScreen);voidDrawGrid();voidUpdatePosition();voidUpdateBackGround();voidUpdate();LRESULT CALLBACKWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);intWINAPIWinMain(HINSTANCE hInstance,HINSTANCE hPrevlstance,LPSTR lpCmdLine,intnCmdShow){g_hInstancehInstance;WNDCLASSEX wcex{0};wcex.cbSizesizeof(WNDCLASSEX);wcex.hbrBackground(HBRUSH)(COLOR_WINDOW1);wcex.hCursorLoadCursor(NULL,IDC_ARROW);wcex.hIconLoadIcon(NULL,IDC_ARROW);wcex.hInstancehInstance;wcex.lpfnWndProcWindowProc;wcex.lpszClassNameCLASS_NAME;wcex.styleCS_HREDRAW|CS_VREDRAW;if(!RegisterClassEx(wcex)){MessageBox(NULL,LFailed to register window class,LERROR,MB_ICONERROR);return0;}hWndCreateWindowEx(0,CLASS_NAME,CLASS_NAME,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL);if(!hWnd){MessageBox(NULL,LFailed to create window,LERROR,MB_ICONERROR);return0;}ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);MSG msg{0};while(GetMessage(msg,NULL,0,0)){TranslateMessage(msg);DispatchMessage(msg);}return(int)msg.wParam;}LRESULT CALLBACKWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){caseWM_CREATE:{HICON hMyIconCreateTransparentIcon(32,32);if(hMyIcon){SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)hMyIcon);SendMessage(hwnd,WM_SETICON,ICON_BIG,(LPARAM)hMyIcon);}InitGraphics(GetDC(hwnd));ReleaseDC(hwnd,GetDC(hwnd));SetTimer(hwnd,1,FDS_MS,NULL);break;}caseWM_KEYDOWN:Player1.Keys[wParam]true;break;caseWM_KEYUP:Player1.Keys[wParam]false;break;caseWM_TIMER:Update();break;caseWM_PAINT:{PAINTSTRUCT ps;HDC hdcBeginPaint(hwnd,ps);DrawCharacter(hdc);EndPaint(hwnd,ps);break;}caseWM_DESTROY:KillTimer(hwnd,1);CleanupGraphics();PostQuitMessage(0);break;}returnDefWindowProc(hwnd,uMsg,wParam,lParam);}HBITMAPCreateTransparentMask(HDC hMemDC,intWidth,intHeight){HBITMAP hMaskBmpCreateBitmap(Width,Height,1,1,NULL);SelectObject(hMemDC,hMaskBmp);HBRUSH hBrushWhiteCreateSolidBrush(RGB(255,255,255));RECT rc{0,0,Width,Height};FillRect(hMemDC,rc,hBrushWhite);DeleteObject(hBrushWhite);HPEN hPenBlackCreatePen(PS_SOLID,1,RGB(0,0,0));SelectObject(hMemDC,hPenBlack);Ellipse(hMemDC,4,4,Width-4,Width-4);DeleteObject(hPenBlack);returnhMaskBmp;}HICONCreateTransparentIcon(intWidth,intHeight){HDC hScreenDCGetDC(NULL);if(!hScreenDC)returnNULL;HDC hMemDCCreateCompatibleDC(hScreenDC);BITMAPINFOHEADER biHeader{0};biHeader.biSizesizeof(BITMAPINFOHEADER);biHeader.biWidthWidth;biHeader.biHeightHeight;biHeader.biPlanes1;biHeader.biBitCount32;biHeader.biCompressionBI_RGB;void*pBitsNULL;HBITMAP hColorBmpCreateDIBSection(hScreenDC,(BITMAPINFO*)biHeader,DIB_RGB_COLORS,pBits,NULL,0);if(!hColorBmp||!pBits){DeleteDC(hMemDC);ReleaseDC(NULL,hScreenDC);returnNULL;}SelectObject(hMemDC,hColorBmp);DWORD*pPixel(DWORD*)pBits;for(intj0;jHeight;j)for(inti0;iWidth;i)pPixel[j*Widthi]0x00000000;intcxWidth/2,cyHeight/2,rWidth/2-2;for(intycy-r;ycyr;y)for(intxcx-r;xcxr;x)if((x-cx)*(x-cx)(y-cy)*(y-cy)r*r)if(y0yHeightx0xWidth)pPixel[y*Widthx]0xFF0000FF;//BGRAHBITMAP hMaskBmpCreateTransparentMask(hMemDC,Width,Height);ICONINFO iconInfo{0};iconInfo.fIconTRUE;iconInfo.xHotspotWidth/2;iconInfo.yHotspotHeight/2;iconInfo.hbmColorhColorBmp;iconInfo.hbmMaskhMaskBmp;HICON hIconCreateIconIndirect(iconInfo);DeleteObject(hColorBmp);DeleteObject(hMaskBmp);DeleteDC(hMemDC);ReleaseDC(NULL,hScreenDC);returnhIcon;}voidInitGraphics(HDC hdcScreen){hPlayerDCCreateCompatibleDC(hdcScreen);hBitPlayerCreateCompatibleBitmap(hdcScreen,Player1.Width,Player1.Height);SelectObject(hPlayerDC,hBitPlayer);HBRUSH hBrushWhiteCreateSolidBrush(RGB(255,255,255));HBRUSH hBrushRedCreateSolidBrush(RGB(255,0,0));SelectObject(hPlayerDC,hBrushRed);Rectangle(hPlayerDC,0,0,Player1.Width,Player1.Height);DeleteObject(hBrushWhite);DeleteObject(hBrushRed);}voidCleanupGraphics(){if(hPlayerDC)DeleteDC(hPlayerDC);if(hBitPlayer)DeleteObject(hBitPlayer);}voidDrawCharacter(HDC hdcScreen){BitBlt(hdcScreen,Player1.X-Player1.Width/2,Player1.Y-Player1.Height,Player1.Width,Player1.Height,hPlayerDC,0,0,SRCCOPY);}voidUpdate(){UpdatePosition();}voidUpdatePosition(){if(Player1.Game_Over)return;intdx0;intdy0;if(Player1.Keys[W])dy-3;if(Player1.Keys[S])dy3;if(Player1.Keys[A])dx-3;if(Player1.Keys[D])dx3;Player1.Xdx;Player1.Ydy;if(Player1.X0)Player1.X0;if(Player1.XWINDOW_WIDTH)Player1.XWINDOW_WIDTH;if(Player1.Y0)Player1.Y0;if(Player1.YWINDOW_HEIGHT)Player1.YWINDOW_HEIGHT;InvalidateRect(hWnd,NULL,TRUE);}备注目前仅实现矩形的wasd移动编辑者zzxjason

相关新闻

2026/8/16 6:01:21

时空可组合性编程:构建物联网与分布式系统的核心范式

1. 先搞清楚“时空可组合性”到底要解决什么问题看到“时空可组合性编程范式”这个标题,很多人第一反应是觉得抽象。我建议先别急着去抠字眼,而是把它理解成一个解决复杂系统构建和演化难题的工程思路。它最核心的价值,是让你在设计和编写代码…

2026/8/16 6:01:21

JVM面试调优实战:从内存结构到GC日志分析的完整学习路径

这次我们来看一个专门针对 JVM 面试与调优的深度教程资源。对于 Java 开发者而言,JVM 不仅是面试中的必考“硬骨头”,更是线上系统性能问题排查和优化的核心战场。一个讲得透彻、覆盖全面的 JVM 教程,能帮你快速构建知识体系,从“…

2026/8/16 7:01:24

SolidWorks钣金通风口命令实战:参数化风扇罩设计与工程图输出

1. 从一张草图到成品:风扇罩设计的完整流程在机械设计,尤其是涉及散热、防护的设备外壳设计中,风扇罩是一个既常见又容易被轻视的部件。它看起来简单,不就是几根筋条加个外框吗?但真要在SolidWorks里快速、规范地把它画…

2026/8/16 7:01:24

python处理csv文件

1、代码如下:import csv import randomwith open(scores.csv, w) as file:writer csv.writer(file, delimiter|, quotingcsv.QUOTE_ALL)writer.writerow([姓名, 语文, 数学, 英语])names [关羽, 张飞, 赵云, 马超, 黄忠]for name in names:scores [random.randra…

2026/8/16 7:01:24

2026三门峡危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总

三门峡老旧房屋与自建房数量众多,危房鉴定机构虽鳞次栉比却鱼龙混杂,不少无资质团队出具的检测报告根本无法通过住建部门审核。小编实地走访筛选本地正规第三方危房鉴定实验室,整理出这份优质服务商清单。收录机构包含连锁检测平台与本土深耕…

2026/8/16 0:00:35

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:36

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/16 0:00:35

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:36

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/15 9:46:39

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/15 4:56:16

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/15 9:46:30

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…