news 2026/10/24 5:41:53

基于C++ TauriCPP做了个能双击就跑的打地鼠

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于C++ TauriCPP做了个能双击就跑的打地鼠

起因挺无聊的:某天想写个小游戏给家里小孩玩,又不想让他电脑上装一坨环境。Electron 打包出来太重,纯 Win32 画 UI 又嫌累,思来想去,用 WebView2 当渲染层、C++ 当逻辑层,TauriCPP最合适。

怎么把前端塞进 exe 的

前端就是普通的 HTML + Canvas + 一点 CSS。关键在构建阶段:把整个frontend/目录扫一遍,按路径生成一份资源表,再用 CMake 写进一个.rc资源文件里。程序启动时从 exe 自己的资源段把文件读出来,交给 WebView2 当虚拟路径加载。效果就是——前端代码一个字都不落在硬盘上,分发的时候只有一个 exe。

我给这套薄壳起了个名,叫 TauriCPP,就放在仓库的TauriCPP/里,纯 C++17 / Win32,没别的依赖。

游戏逻辑和画面是分开的

后端是一个 40ms 一次的 tick:刷怪、状态机、倒计时、连击窗口全在那儿算,算完把整局状态序列化成一个 JSON 快照推给前端。前端只管画和响应用户点击,点一下洞口就发个hit命令回去。

这么拆的好处是逻辑层能单独跑单元测试。我把game.cpp拎出来喂给一个不建窗口的测试程序,刷怪节奏、连击倍率、道具效果、暂停、结算这些一共写了 14 组断言,c++ 那边改坏了立刻能知道。

音效是算出来的,不是放的

最开始想找几段音效文件,后来发现 Web Audio 自带振荡器,干脆全程序化合成:敲中是方波加一点噪声,炸弹是低频轰鸣叠锯齿,倒计时最后五秒每秒滴答一声,开局还有段上行音。背景音乐也顺手写了段 I–V–vi–IV 的音乐盒循环,三角波琶音加正弦垫底,听着不闹。好处是零音频文件,exe 又轻一点。

右上角那个喇叭按钮能一键静音,静音的时候图标会画一道红杠,比之前单纯变灰清楚。

草地上的猫和狗

背景本来就是纯 Canvas 画的草地和木桩洞。后来觉得空荡荡的,又点了几丛花,角落蹲了只猫、一只狗,地上趴着蜗牛,天上飘俩蝴蝶。这些全是画在离屏静态层上的,只在布局时画一次,不占运行时的每帧开销——毕竟游戏里地鼠冒头才需要重绘,平时没必要一直刷。

一个提醒

炸弹是真的坑。我故意做成敲中扣 300 还清空连击,就是为了让小孩别乱点。结果我自己测试的时候也没少中招。

v1.0.0 已经推上去了。源码和构建脚本都在仓库里,clone 下来.\build.ps1一条命令就能出 exe(需要 VS2022 和 WebView2 静态 SDK):

  • Gitee:https://gitee.com/masonwu21/WhackAMole
  • GitHub:https://github.com/Emsoro/WhackAMole

顺手点个 star 不嫌弃。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 5:41:26

大学美育真题复盘:审美理论核心考点与易错点全解析

简介:这份资源是西北工业大学2021年春季学期大学美育课程考试真题,面向正在修读或备考大学美育的高校学生,以及需要梳理美学理论要点的自学者。题目覆盖判断题、多选题与案例分析,涉及审美主体、自然美、形式美、优美与崇高、审美…

作者头像 李华
网站建设 2026/10/24 5:41:23

MySQL进阶实战:核心原理与性能优化指南

1. MySQL 进阶实战:从安装配置到核心原理深度解析从事数据库开发十年,我见过太多开发者停留在基础的CRUD操作层面。实际上,MySQL的进阶能力往往决定着系统性能的上限。今天我们就从实战角度,拆解MySQL那些真正影响生产环境的关键技…

作者头像 李华
网站建设 2026/10/24 5:38:34

商标侵权怎么赔、找谁处理?法律规定都在这

遇到商标侵权可对照参考,以下条文均为法律原文。专用权与侵权认定第五十一条 注册商标的专用权,以核准注册的商标和核定使用的商品为限。第五十二条 有下列行为之一的,均属侵犯注册商标专用权。 (一)未经商标注册人的许可,在同一种…

作者头像 李华
网站建设 2026/10/24 5:27:38

javascript笔记1

js是什么JS的书写位置‘ 1.alert:弹出页面警示框2.内部js书写方法2.外部js书写方法!3.输出与输入的语法变量 1变量的基本使用变量赋值Q:变量赋值后如何更新新值? A:直接给他一个不同的值去更新他 Q:我们提倡同时声明多…

作者头像 李华