Breakout 2D 是一个使用 raylib 开发的打砖块风格游戏,代码库包含单机玩法、局域网/网络对战(基于 ENet)、道具与多关卡存档。该项目实现了若干性能优化(对象池、粒子复用、按需异步加载)。
- 可执行目标:构建后默认二进制名为
game(在构建目录中)。见 CMakeLists.txt。 - 主要源码:
src/main.cpp,src/Game.cpp/include/Game.h,src/Networking.cpp/include/Networking.h,src/Ball*.cpp/src/Paddle*.cpp,src/PowerUp*.cpp。 - 配置与数据:
assets/config.json,levels/levels.json,savegame.json,leaderboard.txt。 - 测试:
tests/collision_test.cpp(CMake targetcollision_test)。
- CMake >= 3.10
- C++17 编译器(例如
g++) - raylib(渲染 / 输入)
- enet(网络,FetchContent 在 CMake 中拉取)
- nlohmann_json(JSON 序列化,FetchContent 在 CMake 中拉取)
- 系统库:OpenGL、X11、pthread、m、dl、rt 等
在首次运行 CMake 前请确保上述系统依赖已安装(例如在 Debian/Ubuntu 上安装对应 dev 包)。
如果你只想直接游玩游戏,无需配置编译环境,可前往 GitHub Releases 下载对应系统的预编译压缩包:
- Windows 用户:下载
Breakout2D-*-windows-x86_64.zip,解压后双击game.exe即可游玩。 - Linux 用户:下载
Breakout2D-*-linux-x86_64.tar.gz,解压后在终端运行./game。 - macOS 用户:下载
Breakout2D-*-macos-arm64.tar.gz,解压后双击运行game(首次运行若提示无法验证开发者,请右键点击选择“打开”,或在终端执行xattr -cr game)。
注意:运行游戏时请保留同级目录下的
assets/和levels/资源文件夹。
在项目根目录执行:
mkdir -p build && cd build
cmake ..
cmake --build . -j
# 构建完成后在 build/ 目录中运行
./game如果你只想编译仓库里的单个示例文件(例如 rotating_cube.cpp),可以使用 g++:
g++ -g rotating_cube.cpp -o output/rotating_cube -lraylib -lGL -lm -lpthread -ldl -lrt -lX11
./output/rotating_cube工作区也包含 VS Code 构建任务(例如 Build rotating_cube 与 Build game (CMake))。
- 默认网络端口:
12345(主机与客户端均使用此端口)。实现位于NetworkSession/Game::StartNetworkHost()和Game::StartNetworkClient()中。见 Game.cpp。 - 在主菜单:
- 按
H启动为主机(Host),程序会启动 ENet 主机并开始广播游戏快照(约 30Hz)。 - 按
C连接为客户端(Client),当前实现会尝试连接本地127.0.0.1;要连接远程主机,请修改源码中调用StartNetworkClient("<HOST>")或运行在目标主机上并确保端口开放。
- 按
- 主机会广播
snapshot消息,客户端发送input(远端挡板位置)。详细协议为 JSON(使用nlohmann::json序列化)。实现位于 Networking.cpp。
注意:在跨机器联机时请确保防火墙/路由允许 TCP/UDP(ENet 使用 UDP)端口 12345。若要自定义端口,可修改 Game::StartNetworkHost() / StartNetworkClient() 的端口参数。
- 左/右方向键:移动挡板(主机/客户端在各自设备上移动)。
- 空格(Space):在菜单中发射/开始游戏。
P:暂停 / 恢复。R:在 GAME OVER/VICTORY 下返回菜单。L:触发异步加载效果(演示异步任务)。H:在菜单中启动主机(Host)。C:在菜单中作为客户端连接(Connect,默认连接 localhost)。G:读取savegame.json(若存在)。F5:保存游戏到savegame.json。F9:从savegame.json读取存档。TAB:查看/退出排行榜(leaderboard)。ESC:在客户端连接等待时取消连接并返回菜单。
上述控件与行为在 Game.cpp 中实现并可在代码中自定义。
assets/config.json:窗口大小、球速、挡板参数、关卡等可配置项(Game::LoadConfig会读取)。levels/levels.json:关卡数据(默认会在Init()中通过LoadLevelsFromJSON加载)。savegame.json:自动/手动保存的游戏状态(SaveGameState/LoadGameState)。leaderboard.txt:排行榜(简单文本格式,分数 与 关卡一行两个数字)。
示例:编辑 assets/config.json 来调整初始窗口或道具参数。
- 单元/集成测试:
tests/collision_test.cpp,可使用 CMake 构建并通过ctest运行。
构建并运行测试示例:
cd build
cmake --build . --target collision_test -j
ctest -R collision_test --output-on-failure- 性能日志:运行时会生成
performance_log_<timestamp>.csv,包含帧数、平均 FPS、活动粒子数与游戏状态,位于运行目录。
src/main.cpp:程序入口,创建Game实例并循环调用Init/Update/Draw/Shutdown。include/Game.h/src/Game.cpp:游戏状态机、输入、网络集成、存档及主要流程。include/Networking.h/src/Networking.cpp:ENet 封装(NetworkSession),实现 JSON 消息接口。src/Ball.*,src/Paddle.*,src/Brick.*,src/PowerUp.*:游戏对象与逻辑。
感谢以下开发者对本项目的贡献与支持:
- 欢迎提交 Issue 或 Pull Request。请在 PR 中说明修改目的,尽量保持风格一致并包含必要注释。
- 若贡献网络/跨平台改进,请包含在不同主机上联机测试的说明(端口、防火墙、NAT 穿透等)。
本项目采用 MIT License 开源许可证。
在仓库 Issue 页提交问题,或通过 leaderboard.txt 同级目录与维护者联系。

