Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

混沌摆跑酷 (Chaos Pendulum Parkour)

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 分

SDL2版独有视觉特性

特效 说明
球体 3D 渲染 Blinn-Phong 预计算纹理(漫反射+镜面高光+Fresnel边缘暗化)
速度响应变色 冷色→热色→白热两段插值,实时 SDL_SetTextureColorMod
Bloom 外发光 3层半透明光晕,动能驱动强度
心跳脉动 ±1.5% 半径 sin 缩放
运动残影 球12帧 + 角色16帧
钩锁绳特效 松弛态能量流 + 拉伸态电弧效果 + 火花粒子
碰撞波纹 钩中球时白色圆环扩散
暂停菜单 呼吸光晕菱形 + TTF多信息框 + 键位分色提示
像素字体 3×5点阵 0-9 + A-Z,支持dot缩放
胜利动画 菱形能量扩散环 + 青绿霓虹面板淡入

构建与运行

SDL2 版本

# 用 Visual Studio 打开 Game/Game.slnx
# 选择 x64 Debug 配置,编译运行
# 或将 Game/SDL2.dll、Game/SDL2_ttf.dll 复制到输出目录

环境要求: Visual Studio 2022+,SDL2.dll / SDL2_ttf.dll(已包含)

EasyX 版本

# 用 Visual Studio 打开 Game-easyx/Game-easyx.slnx
# 需要安装 EasyX 图形库 或 使用项目自带的 easyX/ 目录

窗口尺寸: 1000 × 940 像素


开发历程

项目分 10 个 Checkpoint 迭代开发,CP1-CP3 手动完成,CP4-CP10 AI 辅助。每个阶段均可编译运行。完整记录见 CHECKPOINTS.md


课程信息

  • 题目: 混沌摆跑酷
  • 学校: 大连理工大学软件学院
  • 课程: 面向对象方法程序设计与实践
  • 序号: 44
  • 时间: 2025年7月

About

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages