纯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/8/16 6:00:50 阅读更多 →
JVM面试调优实战:从内存结构到GC日志分析的完整学习路径

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

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

2026/8/16 6:00:50 阅读更多 →
AI Agent开发新选择:Perplexity集成Nemotron 3.5 Lightning,速度与易用性兼得

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

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

2026/8/16 6:00:50 阅读更多 →

最新新闻

Mesh组网实战指南:从原理到部署,避开常见误区

Mesh组网实战指南:从原理到部署,避开常见误区

大家好,我是专注于网络技术分享的博主。最近在整理家庭网络升级方案时,发现一个非常有趣的现象:我在几年前绘制的一张关于Mesh组网的拓扑图,被无数技术文章、产品介绍甚至是一些教程视频广泛引用。然而,随着我对Mesh技…

2026/8/17 9:07:30 阅读更多 →
Windows密码安全机制深度解析:从SAM文件到PE系统密码重置原理

Windows密码安全机制深度解析:从SAM文件到PE系统密码重置原理

1. 从“黑客”到“系统管理员”:一次关于Windows密码的深度探讨最近在网上冲浪,经常能看到一些标题非常吸引眼球的文章或视频,比如“黑客破解电脑密码就是这么简单~惊呆了”。这类内容往往带着一层神秘的面纱,让很多人觉得“黑客”…

2026/8/17 9:07:30 阅读更多 →
构建开放、可靠、可协作的AI智能体框架:从设计理念到工程实践

构建开放、可靠、可协作的AI智能体框架:从设计理念到工程实践

1. 项目概述:为什么我们需要一个“开放、可靠、集体”的AI智能体框架? 最近和几个做AI应用落地的朋友聊天,大家普遍有个共同的痛点:现在市面上各种AI智能体(AI Agent)框架层出不穷,每个都宣称自…

2026/8/17 9:06:29 阅读更多 →
DeepSeek-V4-Pro原生支持OpenAI API:无缝迁移与配置指南

DeepSeek-V4-Pro原生支持OpenAI API:无缝迁移与配置指南

DeepSeek-V4-Pro 正式版来了,这次的重点不是模型参数有多强,而是它原生支持了 OpenAI 的 Responses API,并且专门针对 Codex 这类开发工具做了适配。这意味着,如果你之前在用 OpenAI 的 API 做开发,或者在使用基于 Ope…

2026/8/17 9:06:29 阅读更多 →
Linux后台任务管理:、nohup与disown的原理与应用

Linux后台任务管理:、nohup与disown的原理与应用

1. 项目概述:理解Linux后台任务管理的核心价值 在Linux服务器运维、数据分析或者日常开发中,我们经常会遇到一个经典场景:你通过SSH连接到一台远程服务器,启动了一个需要运行数小时甚至数天的数据处理脚本、一个Web服务&#xff0…

2026/8/17 9:06:29 阅读更多 →
时变MVAR参数估计与双EKF在脑电信号分析中的应用

时变MVAR参数估计与双EKF在脑电信号分析中的应用

1. 项目概述:时变MVAR参数估计的挑战与解决方案 在信号处理领域,时变多变量自回归(MVAR)模型参数估计一直是个棘手问题。传统最小二乘法在面对非平稳信号时表现乏力,而我在最近的心电信号分析项目中就深刻体会到了这一点——当我们需要实时跟…

2026/8/17 9:06:29 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

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

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

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →