一个用 C++17 + SDL2 从零手写的 2D 太空主题平台跳跃游戏。包含 10 个完整关卡、3 种敌方 AI、原创造型与音效,满分的手感调优(土狼时间 / 跳跃缓冲 / 可变跳跃)。
全部视觉素材为程序化绘制(原创,不使用任何马里奥素材),音效为运行时合成的波形(方波 / 正弦 / 噪声)。
- 扎实的手感:土狼时间、跳跃预输入、松开按键小跳、落地 squash 反馈、急停滑铲特效
- 10 关难度曲线:从教学宽松关一路到熔岩边境与虚空决战,节奏递增
- 3 种智能 AI:巡逻怪、追击怪(悬崖急停 / 尖刺回避 / 窄坑跳跃)、飞行怪(立体追踪)
- 完整机制:盾牌格挡、激光射击、心数系统、金币计分、检查点、结算动画
- 进度系统:存档 / 读档 / 标题屏选关 / 通关解锁,附防篡改校验和
- 纯程序化渲染:固定 960×600 逻辑分辨率,深空渐变 + 视差星野 + 程序化天体
- 合成音效:无外部素材,16 种波形音效由公式实时生成
- CI 友好:
--smoke烟雾测试模式,静态关卡配表(.rodata,布局安全静态断言)
| 按键 | 功能 |
|---|---|
A / D |
左右移动 |
SPACE / W / ↑ |
跳跃(按住跳更高,松开截断为小跳) |
SHIFT |
加速奔跑 |
E |
射击(无限弹药,带预瞄虚线) |
I / K |
上 / 下瞄准 |
Q |
举盾格挡(消耗护盾次数,移速降低) |
P / ESC |
暂停 |
R |
重开当前关 |
F5 |
保存进度 |
F9 |
读取进度 |
M |
静音切换 |
标题屏:ENTER 开始 / C 从存档继续 / X 清除存档 / 数字键 1-0 选择已解锁关卡。
- C++17 编译器(GCC / Clang)
- CMake ≥ 3.10
- SDL2 开发库(
pkg-config sdl2可查到) - Linux(其他平台请自行适配 SDL2 获取方式)
sudo apt install libsdl2-dev # Debian/Ubuntu
sudo pacman -S sdl2 # Arch/Manjarocmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
./build/marioRelease 构建默认开启 -O3 -march=native 极致优化(自动向量化 + 当前 CPU 全部指令集,仅适用于本机执行)。
SDL_VIDEODRIVER=dummy ./build/mario --smoke自动输入约 4 秒后退出,若进程正常结束(退出码 0)说明程序运行无崩溃。
.
├── CMakeLists.txt # 构建配置(-O3 优化)
└── src/
├── main.cpp # 入口:SDL 初始化 / 事件分发 / 固定步长调度
├── core/ # 核心:常量、实体、物理、游戏状态机
│ ├── Common.hpp/.cpp # 全局常量、地图布局、物理手感参数
│ ├── Entities.hpp # 纯数据 POD 实体(Player/Goomba/Platform...)
│ ├── GameLogic.hpp/.cpp # 主状态机 + 玩家/敌人/子弹推进
│ └── Physics.hpp/.cpp # 碰撞检测、粒子系统
├── level/ # 关卡
│ └── Level.hpp/.cpp # 10 关静态配表 + 关卡生成
├── render/ # 渲染
│ ├── Renderer.hpp/.cpp # 全部程序化绘制(剔除、视差、特效)
│ └── Font.hpp/.cpp # 像素字体
├── audio/ # 音效
│ └── Audio.hpp/.cpp # 合成波形 SFX
└── save/ # 存档
└── Save.hpp/.cpp # 文本进度存档 + 校验和
进度保存为工作目录下的 save.dat,单行文本:
MARIO1 <unlocked> <level> <score> <coins> <lives> <checksum>
每个字段乘以不同质数系数求和得校验和,读取时逐项校验 + 范围钳制,防篡改 / 防坏档。
- 单向依赖:
Entities(纯数据)→Common(常量)→GameLogic(状态机),杜绝循环引用;main.cpp瘦身为纯调度 - 固定步长循环:
Accumulator模式,物理以 60Hz 恒定步长推进,渲染不受其卡顿拖累 - 编译期安全:关卡配表
static_assert标准布局 / 可平凡拷贝;地图行高统一定义于Common.hpp - 性能知觉:激进的可见性剔除、粒子上限、低逻辑分辨率、
PRESENTVSYNC防撕裂
版权所有 (c) 2026 Shawn-Yu。保留所有权利。
本仓库中的代码仅供公开查看、个人学习和技术审查。
未经原作者明确的书面许可,任何人:
- 不得将本软件(或其任何修改版本)进行二次分发、发布、转售或传播。
- 不得将本软件(或其衍生作品)用于任何商业用途。
- 仅允许在本地进行私下修改和运行,且仅限于个人学习或测试目的。
本软件按“原样”提供,原作者不承担任何形式的担保或责任。