纯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

相关新闻

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

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

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

2026/10/13 18:31:19 阅读更多 →
JVM面试调优实战:从内存结构到GC日志分析的完整学习路径

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

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

2026/10/11 18:42:22 阅读更多 →
AI Agent开发新选择:Perplexity集成Nemotron 3.5 Lightning,速度与易用性兼得

AI Agent开发新选择:Perplexity集成Nemotron 3.5 Lightning,速度与易用性兼得

上周,我像往常一样在几个主流的AI模型服务商之间切换,测试一个需要多轮、长上下文推理的复杂任务。在尝试了多个模型后,我意识到一个核心痛点:对于开发者而言,一个模型的能力上限固然重要,但响应速度、稳定…

2026/10/8 3:08:25 阅读更多 →

最新新闻

卡尔曼滤波器从一维到EKF:机器人状态估计实战笔记

卡尔曼滤波器从一维到EKF:机器人状态估计实战笔记

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

2026/10/13 18:56:01 阅读更多 →
POD-LSTM高维时间序列预测实战:降维+建模+可视化一站式指南

POD-LSTM高维时间序列预测实战:降维+建模+可视化一站式指南

简介:本资源是一份面向数据科学与工业智能领域工程师的POD-LSTM时间序列预测实战指南,聚焦高维多变量场景下的降维建模与可解释预测难题,适用于风电功率、设备状态监测、环境治理等实际业务场景。资源以1个146KB的docx文档形式交付&#xff0…

2026/10/13 18:56:01 阅读更多 →
LiteLLM:大模型多平台协议桥接与标准化调用实战指南

LiteLLM:大模型多平台协议桥接与标准化调用实战指南

1. 一个被严重低估的“协议翻译官”:LiteLLM到底在解决什么真问题?很多人第一次看到LiteLLM这个名字,下意识会以为它是又一个大模型训练框架、推理加速库,或者某种新型开源大模型。我最初也这么想——直到在某次跨平台AI服务集成中…

2026/10/13 18:56:01 阅读更多 →
华为AI DevSpace编译星闪WS63 SDK全攻略

华为AI DevSpace编译星闪WS63 SDK全攻略

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

2026/10/13 18:56:01 阅读更多 →
Django+Vue小说推荐系统:从爬虫到可视化完整实现

Django+Vue小说推荐系统:从爬虫到可视化完整实现

看到标题里同时出现了“DjangoVue.js”“小说推荐系统”“小说可视化”“小说爬虫”“大数据毕业设计”这一串关键词,我基本能猜到你在选毕设题目时经历了什么——翻了一下午题目清单,要么是太简单拿不出手,要么是纯理论写到头秃,…

2026/10/13 18:56:01 阅读更多 →
静态时序分析实战:从时序弧到时钟约束的完整解读

静态时序分析实战:从时序弧到时钟约束的完整解读

说实话,静态时序分析这个系列写到第二篇,我想换个切入点。上一篇我们把STA是什么、为什么需要它、建立时间和保持时间的基本定义聊了一遍。但很多刚接触时序分析的同学,看完概念之后对着工具报出来的一屏时序报告,还是会有一种&qu…

2026/10/13 18:54:57 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →