Dynamite音乐游戏谱面图片生成工具(C++ 实现)
下面列出仓库的主要目录与文件(自顶向下):
DynaChartView/
├─ CMakeLists.txt # 顶层 CMake 构建配置
├─ README.md # 项目说明(包含本节)
├─ ImageGenerator/ # 图像生成子工程(渲染器与资源)
│ ├─ CMakeLists.txt
│ ├─ include/
│ │ └─ dynachart_renderer.h # 渲染器头文件
│ └─ src/
│ └─ dynachart_renderer.cpp # 渲染器实现
├─ src/
│ └─ main.cpp # 程序入口、命令行解析与协调逻辑
├─ include/
│ ├─ version.h.in # 版本信息模板,CMake 配置时生成 version.h
│ └─ version.h # 项目版本常量
├─ ChartStore/ # 谱面数据结构与解析相关代码
│ └─ include/
│ └─ chart_store.h # ChartStore 类定义
├─ .gitignore
├─ .gitattributes
└─ LICENSE.txt
说明:
ImageGenerator包含实际的 Dynachart 风格渲染实现(基于 OpenCV 与 FreeType)。src/main.cpp是命令行工具的入口,负责读取谱面(XML)、初始化渲染器并保存输出图像。ChartStore/include/chart_store.h提供谱面数据的内存结构与解析功能。- 顶层
CMakeLists.txt与子目录ImageGenerator/CMakeLists.txt用于配置与构建(使用 Ninja 生成器,C++14,MSVC /utf-8 编码)。
Estahv Hard 11 (默认参数)
Finixtahv Giga 15 (-b 2 -l 15 -S 0.7 —— 每2小节高亮小节线,显示时间戳,一页有15小节,流速0.7)
# Windows
.\build\Release\DynaChartView.exe input.xml output.png
# Linux/macOS
./build/DynaChartView input.xml output.png用法:DynaChartView <输入文件> <输出文件> [选项]
选项:
-s <float>, --scale <float> 缩放比例 (默认:1.0)
-S, --speed <float> 显示速度 (决定小节高度,默认:0.5)
-l, --page-limit <int> 每页小节数 (默认:32)
-f, --font <path> 字体路径 (默认:系统文件夹的arial.ttf)
--help 显示帮助信息
示例:
DynaChartView chart.xml
DynaChartView chart.xml chart.png
DynaChartView chart.xml chart.png -s 1.2
DynaChartView chart.xml chart.png -S 0.7 -l 24
DynaChartView chart.xml chart.png -f /usr/share/fonts/arial.ttf
release中提供的.exe安装包,安装后看安装文件夹,里面有vc_redist.x64.exe,运行即可安装MSVC运行时
#include "chart_store.h"
#include "dynachart_renderer.h"
int main() {
// 1. 读取谱面
chart_store chart;
int result = chart.readfile("chart.xml");
if (result != 0) {
std::cerr << "Failed to load chart: " << result << std::endl;
return 1;
}
// 2. 创建渲染器
DynachartRenderer renderer;
// 3. 设置选项
DynachartRenderer::Options options;
options.scale = 1.5;
options.barHeight = 60.0;
options.gridVisible = true;
// 4. 生成图片
renderer.render(chart, "output.png", options);
return 0;
}- Visual Studio 2019/2022 (包含 C++ 桌面开发)
- CMake 3.15+
- vcpkg (推荐,用于管理依赖)
vcpkg 是 Microsoft 开发的 C/C++ 包管理器,可自动解决 OpenCV 和 FreeType 依赖。
# 1. 克隆 vcpkg (在项目目录外或任意位置)
cd C:\
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
# 2. 初始化 vcpkg
.\bootstrap-vcpkg.bat
# 3. 安装项目所需依赖
.\vcpkg install opencv4:x64-windows freetype:x64-windows
# 4. 将 vcpkg 集成到 Visual Studio (可选,但推荐)
.\vcpkg integrate install
# 完成后,CMake 会自动找到这些库vcpkg 安装说明:
opencv4:x64-windows- 图像处理库 (包含 core, imgcodecs, highgui 等模块)freetype:x64-windows- 字体渲染库 (用于时间戳和文本显示)
CMake 配置时指定 vcpkg toolchain:
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE="<Your vcpkg install path>\vcpkg\scripts\buildsystems\vcpkg.cmake" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>"静态链接 MSVC 运行时
如果使用 vcpkg 静态版本,记得:
安装 -static 版本的库 (opencv4:x64-windows-static freetype:x64-windows-static) 可能需要定义 OPENCV_STATIC 宏
# 1. 安装静态依赖
.\vcpkg install opencv4:x64-windows-static freetype:x64-windows-static
# 2. 配置 CMake
cmake .. -DCMAKE_TOOLCHAIN_FILE="<Your vcpkg install path>\vcpkg\scripts\buildsystems\vcpkg.cmake" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>"
# 3. 编译
cmake --build . --config Release
方法 1:OpenCV 官方安装包 + FreeType 手动编译
# 下载 OpenCV 4.x Windows 安装包
# https://github.com/opencv/opencv/releases
# 解压后设置环境变量
$env:OPENCV_DIR = "C:\opencv\build\x64\vc15\lib"
$env:Path += ";C:\opencv\build\x64\vc15\bin"
# 注意:FreeType 需要单独下载源码编译,较麻烦# 1. 进入项目目录
cd path/to/DynaChartView
# 2. 创建构建目录
if (Test-Path build) { Remove-Item -Recurse -Force build }
mkdir build
cd build
# 3. 配置项目 (自动检测 MSVC)
cmake .. -DCMAKE_BUILD_TYPE=Release
# 或者指定生成器
# cmake .. -G "Visual Studio 17 2022" -A x64
# 4. 编译
cmake --build . --config Release
# 5. 运行程序
.\Release\DynaChartView.exe input.xml output.png如需生成不依赖 VCRedist 的独立可执行文件:
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>"# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y \
build-essential \
cmake \
libopencv-dev \
libfreetype6-dev \
git
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
sudo yum install -y cmake opencv-devel freetype-devel# 1. 进入项目目录
cd DynaChartView
# 2. 创建构建目录
mkdir -p build && cd build
# 3. 配置项目
cmake .. -DCMAKE_BUILD_TYPE=Release
# 4. 编译 (使用所有 CPU 核心)
make -j$(nproc)
# 5. 运行程序
./DynaChartView input.xml output.pngcmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_EXE_LINKER_FLAGS="-static -static-libgcc -static-libstdc++"# 安装 Homebrew (如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装依赖
brew install cmake opencv freetype# 1. 进入项目目录
cd DynaChartView
# 2. 创建构建目录
mkdir -p build && cd build
# 3. 配置项目
cmake .. -DCMAKE_BUILD_TYPE=Release
# 4. 编译
make -j$(sysctl -n hw.ncpu)
# 5. 运行程序
./DynaChartView input.xml output.png- XML 编码: UTF-8
- 输出图片: PNG (RGBA)
问题 1: cmake 不是可识别的命令
# 解决方法:将 CMake 添加到 PATH
$env:Path += ";C:\Program Files\CMake\bin"问题 2: 找不到 OpenCV
# 设置 OpenCV 路径
$env:OpenCV_DIR = "C:\opencv\build"
cmake .. -DCMAKE_PREFIX_PATH="C:\opencv\build"问题 3: 缺少 MSVC 运行时
# 使用静态链接
cmake .. -DCMAKE_EXE_LINKER_FLAGS="/MT"问题 1: CMake 版本过低
# 安装新版本
wget https://github.com/Kitware/CMake/releases/download/v3.24.0/cmake-3.24.0-linux-x86_64.tar.gz
tar -xzf cmake-3.24.0-linux-x86_64.tar.gz
sudo cp -r cmake-3.24.0-linux-x86_64/* /usr/local/问题 2: OpenCV 库找不到
# 设置 OpenCV 路径
export OpenCV_DIR=/usr/lib/x86_64-linux-gnu/cmake/opencv4问题 1: 字体渲染不显示
- Windows: 确保字体路径为
C:\Windows\Fonts\arial.ttf - Linux: 确保字体文件存在且可读
问题 2: 图片生成失败
- 检查 OpenCV 是否正确安装
- 确认输入 XML 文件格式正确
- BOARD_SIZE: 149 像素/单位 (正面轨道宽度基准)
- NOTE_SIZE: 129 像素/单位 (侧边轨道宽度基准)
- FRONT_BOARD_RATE: 正面轨道缩放系数
- TIME_SIZE: 2880 像素 (单页时间宽度)
// 音符颜色
COLOR_NORMAL = (100, 200, 255) // 蓝色
COLOR_CHAIN = (100, 255, 100) // 绿色
COLOR_HOLD = (255, 200, 100) // 橙色DynachartRenderer::Options options;
options.progressCallback = [](int current, int total) {
double percent = (double)current / total * 100;
printf("Progress: %d/%d (%.1f%%)\n", current, total, percent);
};
renderer.render(chart, "output.png", options);- Fork 项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目由 AXIS5开发,保留所有权利。
- 开发者: AXIS5
- 项目仓库: DynaChartView
- 问题反馈: 通过 GitHub Issues
本项目参考了以下开源项目:
- 🎨 调低HOLD颜色亮度 - (0, 134, 70)变为(0, 100, 50),叠HOLD情况下不那么瞎眼了。
- 🐛 修复Linux端编译。修复了Linux环境下由于编译器支持问题导致的编译失败。现在在Fedora 36下可以正常编译。
- 🔄 改变Linux端默认使用字体路径 - fontPath = "/usr/share/fonts/dejavu-sans-fonts/DejaVuSans.ttf";
- 🐛 修复HOLD堆放逻辑。现在,对于叠在一起的HOLD键,后面的HOLD会正确堆放在前一个HOLD的上方,而不是覆盖在一起了。
- 🎨 HOLD显示变为透明度显示 - 通过加入新的中间层HoldBoard,HOLD键现在通过调整透明度来显示重叠关系,增强视觉效果。
- 📏 过宽note跨页显示修复 - 超出单页外部分的note现在被会正确截断。
- 🎨 新增左右侧背景色 - 左侧暗绿色、右侧暗紫色,增强视觉区分度
- 📏 小节线跨页问题修复 - 确保小节线当前页内绘制
- ⏱️ 时间戳渲染优化 - 修复时间戳跨页渲染问题,在正确位置显示
- 🔄 半小节线逻辑修复 - 半小节线于drawPage函数绘制,通过drawBoard函数复制到整个图片
- 🐛 修复无法正确显示汉字的bug。现在对于任何系统环境都能正确显示文件名了。已在中文和日语系统下测试。
- ✨ 初始版本发布
- 🎨 支持三侧谱面渲染
- 📐 音符右端点对齐修复
- ⏱️ 时间戳渲染功能
- 🔄 进度条回调支持
- 🐛 修复多个已知问题
Happy Charting! 🎵