C++ 课程项目 | 大连理工大学软件学院 | 面向对象方法程序设计与实践
基于混沌双摆物理系统的单人动作跑酷游戏。角色在双摆杆和球面上行走,借助混沌运动的动量甩出,配合钩锁在杆与摆锤间穿梭,躲避尖刺、触碰得分平台获取分数。
theCHAOS/
├── README.md
├── CHECKPOINTS.md # 完整 Checkpoint 总览 + 技术难点
├── .gitignore
│
├── Game/ # SDL2 版本 (推荐体验 ✨)
│ ├── Game/
│ │ ├── main.cpp # 程序入口
│ │ ├── Game.h / Game.cpp # 主循环、输入、渲染、碰撞 (375行)
│ │ ├── Pendulum.h / Pendulum.cpp # 双摆物理 + 3D球体渲染 (741行)
│ │ ├── Physics.h / Physics.cpp # 拉格朗日方程 + 积分器 (124行)
│ │ ├── Player.h / Player.cpp # 角色状态机 + 钩锁 + 步行面 (1314行)
│ │ ├── Stage.h / Stage.cpp # 尖刺/得分平台生成与碰撞 (308行)
│ │ ├── Vec2.h / Vec2.cpp # 2D向量运算 (70行)
│ │ └── 01.cpp # 早期测试代码
│ ├── SDL2-2.32.4/ # SDL2 库 (已包含)
│ ├── SDL2_ttf-2.22.0/ # SDL2_ttf 库 (已包含)
│ ├── checkpoints/ # 分阶段详细开发文档 (cp1-cp8)
│ ├── game-design.md # 完整游戏设计文档
│ ├── dev-playbook.md # 开发调试手册
│ └── Game.slnx # Visual Studio 解决方案
│
├── Game-easyx/ # EasyX 版本
│ ├── Game/ # 源码 (与SDL2版本核心逻辑一致)
│ ├── easyX/ # EasyX 库 (已包含)
│ ├── assets/ # 素材 (背景、角色贴图)
│ ├── tools/ # 辅助脚本
│ └── Game-easyx.slnx # Visual Studio 解决方案
│
└── scripts/
└── build_release.bat # 一键 Release 构建+打包
总代码量: SDL2版 ~3,920行 | EasyX版 ~2,749行
步行面上观察摆向 → 选时机脱手 → 混沌运动甩出 →
空中钩锁调整方向 → 落回结构面 → 触碰平台得分 → ...
角色在双摆的四段步行面(L1杆 → m1球面 → L2杆 → m2球面)上行走。由于双摆的混沌特性,轨迹不可预测——玩家需要借助物理直觉判断跳跃与钩锁时机。
| 按键 | 功能 |
|---|---|
| A / D | 在步行面上左右移动 |
| W | 跳跃脱手(继承脚下速度)/ 钩锁中打断松钩 |
| 鼠标左键 | 向光标方向发射钩锁(最大射程 320px) |
| Space | 暂停 / 恢复 |
| R | 全局重置(摆+角色+场景) |
| Q / E | 重力倍率 -0.1x / +0.1x(范围 0.1x~3.0x) |
| F | 球捕获模式切换(仅杆端 / 全程距离) |
| 1~5 | 切换双摆初始预设角度 |
| Esc | 退出 |
基于拉格朗日力学推导角加速度方程,使用 Symplectic Euler 积分器(32子步/帧),能量守恒误差 < 0.1%。
| 参数 | 值 | 说明 |
|---|---|---|
| L₁ / L₂ | 225 / 180 px | 杆长 |
| m₁ / m₂ | 2.0 / 1.5 | 质量 |
| R₁ / R₂ | 50 / 40 px | 球半径 |
| g | 600 px/s² | 重力(可调) |
| 段 | 说明 | 吸附方式 |
|---|---|---|
| L1_ROD | L1 杆上方侧(偏移12px) | 点到线段距离 |
| M1_BALL | m1 关节球面弧 | 点到球心距离 - R₁ |
| L2_ROD | L2 杆上方侧 | 点到线段距离 |
| M2_BALL | m2 末端球面弧 | 点到球心距离 - R₂ |
| 表面 | 速度甩出 | 角度脱落 | 杆面下滑 |
|---|---|---|---|
| 杆 (L1_ROD / L2_ROD) | ❌ | ❌ | ✅ 倾角 >30° |
| 球 (M1_BALL / M2_BALL) | ✅ ω×R > 200 px/s | ✅ 边界 t<0.01 或 t>0.99 | ❌ |
(杆面下滑/球面脱落)
▼
┌─────────┐ W键 ┌───────┐ 钩锁命中 ┌──────────┐
│ ON_ROD │ ──────→ │ FLY │ ────────→ │ HOOKED │
│ (步行面) │ ←────── │ (自由) │ ←─────── │ (弹性绳) │
└──────────┘ snap回面 └───────┘ W打断跳跃 └──────────┘
│ │ │
└───────┬───────────┴──────────┬───────────┘
│ 碰刺/出屏 │
▼ ▼
┌──────────────────────────────────┐
│ DEAD │
│ (粒子爆发 → 0.5s → 自动重置) │
└──────────────────────────────────┘
- 2发充能,独立冷却 0.5s(SDL2)/ 1.0s(EasyX)
- 射线检测:优先命中线段(杆)或圆(球),取最近者
- 弹性绳物理:K=7.0,自然绳长 8px,最大拉伸 1.4x
- 钩点随摆锤实时运动
- W 键可打断钩锁并附加跳跃初速度 400 px/s
| 得分方式 | 分值 | 说明 |
|---|---|---|
| 触碰得分平台 | +1 | AABB碰撞检测,触碰后该平台刷新 |
| 存活 15 秒 | +1 | 非死亡状态下累计 |
| 死亡 | -1 | 最低 0 分 |
| 特效 | 说明 |
|---|---|
| 球体 3D 渲染 | Blinn-Phong 预计算纹理(漫反射+镜面高光+Fresnel边缘暗化) |
| 速度响应变色 | 冷色→热色→白热两段插值,实时 SDL_SetTextureColorMod |
| Bloom 外发光 | 3层半透明光晕,动能驱动强度 |
| 心跳脉动 | ±1.5% 半径 sin 缩放 |
| 运动残影 | 球12帧 + 角色16帧 |
| 钩锁绳特效 | 松弛态能量流 + 拉伸态电弧效果 + 火花粒子 |
| 碰撞波纹 | 钩中球时白色圆环扩散 |
| 暂停菜单 | 呼吸光晕菱形 + TTF多信息框 + 键位分色提示 |
| 像素字体 | 3×5点阵 0-9 + A-Z,支持dot缩放 |
| 胜利动画 | 菱形能量扩散环 + 青绿霓虹面板淡入 |
# 用 Visual Studio 打开 Game/Game.slnx
# 选择 x64 Debug 配置,编译运行
# 或将 Game/SDL2.dll、Game/SDL2_ttf.dll 复制到输出目录环境要求: Visual Studio 2022+,SDL2.dll / SDL2_ttf.dll(已包含)
# 用 Visual Studio 打开 Game-easyx/Game-easyx.slnx
# 需要安装 EasyX 图形库 或 使用项目自带的 easyX/ 目录窗口尺寸: 1000 × 940 像素
项目分 10 个 Checkpoint 迭代开发,CP1-CP3 手动完成,CP4-CP10 AI 辅助。每个阶段均可编译运行。完整记录见 CHECKPOINTS.md
- 题目: 混沌摆跑酷
- 学校: 大连理工大学软件学院
- 课程: 面向对象方法程序设计与实践
- 序号: 44
- 时间: 2025年7月