纯WINDOWS API的C++2D小游戏Subterra(目前还未开发,实时更新)

发布时间:2026/10/6 15:18:31

纯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/10/6 15:22:22

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

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

2026/10/6 15:22:28

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

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

2026/10/7 5:25:18

Claude Code 卡住转圈?从 Spinner 状态识别到完整排查方案

说实话,用Claude Code最让人血压上升的画面,就是那个spinner一直在转:转十秒、转三十秒、转一分钟,屏幕上一行字都没多。不管你是刚装好claude code的新手,还是已经在VSCode里配好插件的老手,遇到这种"…

2026/10/7 5:25:18

PCB光学定位点Mark点设计规范与实战指南

1. 光学定位点不是“可有可无的装饰”,而是SMT产线稳定运行的生命线刚入行做PCB设计时,我被安排画一块四层板,功能简单,主控加几个外围器件。Layout快收尾时,组长扫了一眼我的文件,指着空白的板边问&#x…

2026/10/7 5:25:18

BqLog日志组件:环形队列与自适应总线设计解析

1. 这不是普通日志组件,是王者荣耀后台的“数据高速公路”你可能在调试游戏时见过那种毫秒级响应的日志输出——不是等几秒才刷出一行,而是操作刚完成,log就已落盘;不是卡在主线程阻塞UI,而是滑动英雄技能面板、切屏、…

2026/10/7 5:25:18

小米有品静态电商网页:HTML+CSS完整搭建与部署解析

简介:以小米有品为蓝本的HTMLCSS购物网站练手项目,适合前端初学者、网页设计课程学生作为作业参考与课程设计素材。项目完整覆盖电商站常见页面,包括首页轮播、商品分类、商品详情、购物车、登录注册等,用HTML搭建页面结构&#x…

2026/10/7 5:25:18

UE5游戏引擎架构深度解析:模块、UObject、线程与Lyra实战

做游戏引擎架构解析,前面几篇我一直尽量绕开具体引擎,讲通用设计思路。但聊到最后,如果只停留在“理论可行”的层面,总觉得隔靴搔痒。这次直接把矛头对准Unreal Engine,结合这几年在UE5项目里的实战经验,聊…

2026/10/7 5:20:18

Spring Boot农村客运系统实战:从设计到部署的完整总结

做农村客运服务系统这个项目,是我过去几个月投入精力最多的一件事。说直白点,这个基于Spring Boot的农村客运服务系统,就是要把农村班线的班次管理、售票订票、车辆调度和站点信息从纸质台账和微信群聊里搬到一个正经的后台系统里来。它解决的…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

ESP32免重刷固件:浏览器直接修改NVS键值实现WiFi配置更新

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

SAP HANA查询结果导出CSV:避开乱码、性能与权限的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

数字后端Placement阶段Density与Congestion控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑