本页目录

微信小游戏源码合集(wechatGame-all)

wechatGame-all · Aimee1608/wechatGame-all

这是一个用 JavaScript 编写的微信小游戏源码集合仓库,作者将搜集到的小游戏源码汇总在一起。仓库描述为「微信小游戏集合,搜集的小游戏源码」,未提供具体游戏清单与玩法说明。README 摘录内容实际来自 ammo.js 物理引擎文档,与仓库主...

其他 无明确引擎 C++ 碰撞检测 物理系统 高级
★ Stars 4,588 Forks 581 License 未明确 更新 2026-11-07

国内开发环境适配

Windows
AI 推断/待核验
Linux
AI 推断/待核验
macOS
AI 推断/待核验
引擎 / 框架:无明确引擎 暂无中文教程标记 未标记站长实测
构建依赖 Emscripten 与 cmake,README 未提供国内镜像方案;emsdk 下载与 Docker 镜像拉取可能受网络影响,具体待核验。

中文项目介绍

ammo.js 是 Bullet 物理引擎面向 JavaScript 的直接移植版本。项目使用 Emscripten 将原本以 C++ 编写的 Bullet 源码编译为 JavaScript,源码翻译过程不经过人工重写,因此作者在 README 中说明其功能应与原始 Bullet 保持一致。

项目名称中的 “ammo” 是一句玩笑式缩写,意为“通过从 C++ 编译 Bullet,避免了自己动手写一个 JS 物理引擎”。ammo.js 与 Bullet 一样采用 zlib 许可证。

需要区分两种使用路径:

  • 如果你的业务代码本身用 C++ 编写,可以直接用 Emscripten 编译并链接 Bullet,或通过 emscripten-ports 的 -s USE_BULLET=1 使用 Bullet,此时并不需要 ammo.js。
  • 如果你想在 JavaScript 中调用物理能力,则使用 ammo.js 自动生成的绑定代码。

技术架构分析

构建方式

自行构建 ammo.js 需要 Emscripten 与 cmake。README 给出的基本流程是:

$ cmake -B builds
$ cmake --build builds

配置阶段可指定若干关键选项,例如:

$ cmake -B builds -DCLOSURE=1                # 使用 closure 编译
$ cmake -B builds -DTOTAL_MEMORY=268435456   # 初始 256MB 堆(默认 16MB)
$ cmake -B builds -DALLOW_MEMORY_GROWTH=0    # 固定堆,而非默认可增长堆

在 Windows 上可使用 cmake 的 MinGW 生成器:

> cmake -B builds -G 'MinGW Makefiles'
> cmake --build builds

若 Emscripten 不是通过 emsdk 安装,可用 -DEMSCRIPTEN_ROOT 指定其位置。

使用 Docker 构建

README 专门给出 Docker 构建路径,其好处包括保持本机原生环境干净、便于移植等。安装 Docker 后执行:

$ docker-compose build        # 创建 Docker 镜像
$ docker-compose up           # 创建容器并构建 ammo.js
$ docker-compose run builder  # 修改后再次构建 ammojs 目标

如需给 cmake 追加参数,需要编辑 docker-compose.yml。

减小构建体积

README 提供两种缩减产物体积的思路:

  • 从 ammo.idl 中移除不需要的接口,例如仅在需要可视化调试渲染时才用到的 btIDebugDraw 与 DebugDrawer。
  • 从 make.py 的 -s EXPORTED_RUNTIME_METHODS=[] 参数中移除方法,例如 UTF8ToString 仅在需要 DebugDrawer 输出可读错误信息时才需要。

补充说明

示例与演示

README 列出了若干可直接打开的 WebGL 演示,覆盖 Bullet 的典型能力:

  • Cubes:刚体立方体演示,另有 WebAssembly 版本。
  • SoftBody-Rope:软体绳索。
  • SoftBody-Cloth:软体布料。
  • SoftBody-Volume:软体体积。
  • Heightmap:高度图地形。
  • Vehicle:车辆场景。

这些示例可作为理解 ammo.js 调用方式的入口。README 还指出 examples/hello_world.js 是 Bullet 的 HelloWorld.cpp 翻译成 JavaScript 的完整示例,examples/webgl_demo/ammo.html 则是 WebGL 演示代码。

绑定 API 要点

ammo.js 的 API 由 Bullet 源码自动生成,因此大体与 Bullet 一致,但 README 明确列出若干差异与注意事项:

  • 所有 ammo.js 元素都应通过 Ammo.* 访问,例如 Ammo.btVector3。
  • 结构体与类的成员变量通过带 get_ / set_ 前缀的存取函数访问,例如 rayCallback.get_m_rayToWorld()。README 解释未使用原生 JavaScript getter/setter,是出于性能方面的考虑。
  • 返回或获取 float&、btScalar& 的函数会被转换为 float。原因是 float& 在 C++ 中相当于语法更友好的 float*,若在 JavaScript 中每次调用都写堆会非常难用;转换后可以直接写 new btVector3(5, 6, 7)。如确需 float& 方法,可提交 issue。
  • 并非所有类都被暴露,只有 ammo.idl 中描述的内容会被包装;需要额外内容可通过 pull request 补充。
  • 对运算符函数绑定提供实验性支持,例如 op_set、op_add、op_sub、op_mul、op_div、op_get、op_eq。

测试与运行示例

自动测试通过 npm test 运行,底层使用 ava,分别针对 JavaScript 与 WebAssembly 两种构建:

$ npm run test-js      # --> AMMO_PATH=builds/ammo.js ava
$ npm run test-wasm    # --> AMMO_PATH=builds/ammo.wasm.js ava

也可以直接运行 ava 以获得更多选项,例如 npx ava --verbose、npx ava --node-arguments inspect。未定义 AMMO_PATH 时默认测试 builds/ammo.js。

运行示例方面,仓库把 http-server 作为开发依赖引入。需要从仓库根目录提供服务,以便示例能在 builds 目录找到 ammo:

$ npx http-server -p 3000 .

常见问题与发布流程

README 的 Troubleshooting 指出一个常见错误:创建对象时忘记写 new,例如 var vec = Ammo.btVector3(1,2,3); 是错误写法,可能导致 Cannot read property 'a' of undefined 或 Cannot read property 'ptr' of undefined 之类的报错。

提交 issue 时,README 建议附上可复现问题的脚本,便于调试并纳入自动测试。

发布流程要求:先用 cmake -B builds -DCLOSURE=1 启用 closure 配置,构建 asm.js 与 wasm 两个库,确保 npm test 全部通过,再运行 examples/webgl_demo 的 WebGL 演示确认显示正常(例如用 firefox examples/webgl_demo/ammo.html;Chrome 需要 Web 服务器,因为其不接受 file:// URL)。

上游版本

README 说明 ammo.js 基于 Bullet 2.82,并合入了来自 2.83 的 raycast 修复补丁。

学习建议

  • 先阅读 examples/hello_world.js 理解最小调用路径,再对照 examples/webgl_demo/ammo.html 看渲染与物理如何协作。
  • 牢记 Ammo.* 命名空间与 get_ / set_ 存取函数约定,可减少调试成本。
  • 若只需在 C++ 侧使用 Bullet,优先考虑直接编译 Bullet,而非引入 ammo.js。
  • 构建产物较大时,按 README 的说明裁剪 ammo.idl 与导出运行时方法。

开源许可证与版权说明

许可证标识:未明确。源码、资源与依赖许可可能不同,请以官方仓库为准。本站仅做索引,不托管源码。

相似项目