大量合并更新

This commit is contained in:
OLDREDSTONE 2026-03-25 15:25:22 +08:00
parent 4e6cc59300
commit 8b4877724e
7 changed files with 23 additions and 91 deletions

View File

@ -47,7 +47,7 @@
| **轨道特效类** | | | |
| 隐藏轨道 | `X` | [轨道移动](../pages/moverow.md#轨道的显示与隐藏) | 改变轨道的显示和隐藏状态 |
| 移动轨道 | `O` | [轨道移动](../pages/moverow.md#轨道的移动) | 让轨道在画面中移动,缩放,旋转等 |
| 重排序:行 | `Shift+O` | | 将轨道移动到不同房间,或是重新对轨道进行排序 |
| 轨道重排序~~重排序:行~~ | `Shift+O` | | 将轨道移动到不同房间,或是重新对轨道进行排序 |
| 播放表情 | `J` | [自制角色与精灵资源](../pages/spritesheet.md#播放表情) | 改变轨道中角色的表情 |
| 改变角色 | `Shift+J` | [轨道视效](../pages/rowfx.md#轨道涂色) | 改变轨道的角色 |
| 轨道涂色 | `R` | [轨道视效](../pages/rowfx.md#轨道涂色) | 设置轨道的边框、涂色、透明度 |
@ -99,7 +99,7 @@
| 绘制精灵图 | `R` | [使用精灵](../pages/decoration.md#绘制精灵图) | 设置精灵的边框、涂色、透明度 |
| 播放表情 | `J` | [使用精灵](../pages/decoration.md#播放表情) | 播放精灵的表情 |
| 显示/隐藏 | `X` | [使用精灵](../pages/decoration.md#显示/隐藏) | 显示或隐藏精灵 |
| 重排序:精灵图 | `Shift+O` | | 将精灵移动到不同房间,或是重新对精灵进行排序 |
| 精灵重排序~~重排序:行~~ | `Shift+O` | | 将精灵移动到不同房间,或是重新对精灵进行排序 |
| 平铺精灵图 | `I` | [使用精灵](../pages/decoration.md#平铺精灵图) | 显示或隐藏精灵 |
| 混合精灵图 | `B` | | 设置精灵的颜色混合模式 |
| 注释 | `M` | [标签](../pages/tag.md#让事件摆放更有条理) | 添加注释内容或插入注释型自定义方法 |

View File

@ -1,5 +1,18 @@
# 更新信息
#### 2026-03-25
- 更新事件列表
- 更新预设特效列表
- 修正格式错误
- 更改“设置窗口数量”译名为“设置窗口内容”
- 补充 WindowDance 页内容
- 更新轨道涂色属性页图片
- 更新轨道重排序事件
- 更新旋转轨道事件的详细内容
- 更新默认轨道的各部分位置分布数值
- 为改变轨道事件描述添加图片
- 更新制作人员表
#### 2026-03-01
- **变量**一节被替换为[表达式](../pages/expression.md)。
- 为各种标题添加了容易辨识和定位的背景渐变条。

View File

@ -15,6 +15,7 @@
- [正宗的小绿君](https://space.bilibili.com/1782518253)
- [kuanpan](https://space.bilibili.com/1928620300)
- [obugs](https://space.bilibili.com/498017546)
- [zyx](https://space.bilibili.com/2045355693)
- 视频制作:
- [吾夜犹明](https://space.bilibili.com/29219948)
- [山不转水到渠成](https://space.bilibili.com/4870582)

View File

@ -4,7 +4,7 @@
制作一个自制谱的第一步就是导入一首音乐。虽然编辑器本身对音频文件格式无严格要求,但还是**请使用.ogg格式的音频文件**以减少出BUG的可能性对后续的调整偏移和选关界面试听也有帮助。如果你需要.ogg格式但是手头只有.mp3可以使用[aconvert](https://www.aconvert.com/cn/audio/mp3-to-ogg)等软件转换。**音乐的文件名尽量只包含字母、数字和半角符号**。
点击左上角的**菜单→新关卡**来创建新关卡编辑器会帮我们选择到默认位置C:\用户\你自己的用户名\文档\Rhythm Doctor。如果你有长期做谱的需求建议另取一个独立文件夹会方便管理。在这个文件夹里创建的文件夹就代表着你制作的不同的谱面。创建文件夹后进入输入好谱面文件名点击确定就成功创建了一个谱面。
点击左上角的**菜单→新关卡**来创建新关卡,编辑器会帮我们选择到默认位置(`C:\用户\你自己的用户名\文档\Rhythm Doctor`)。如果你有长期做谱的需求,建议另取一个独立文件夹,会方便管理。在这个文件夹里创建的文件夹,就代表着你制作的不同的谱面。创建文件夹后进入,输入好谱面文件名,点击确定,就成功创建了一个谱面。
> 在编辑已保存的关卡时,编辑器会每隔 5 分钟在此关卡相同目录生成一个 `backup.rdlevel` 备份文件并覆盖原有 `backup.rdlevel` 文件,如果做到一半编辑器崩了没保存就可以打开这个文件来恢复数据。
@ -20,7 +20,7 @@
## 调整曲速和偏移
接下来一点十分重要那就是调节BPM也就是一分钟有多少拍的意思只有设置对了BPM才能让游戏节奏和音乐速度保持一致。排除掉一些变速曲我们可以用[ArrowVortex](https://arrowvortex.ddrnl.com/)。或者你不想额外下载软件的话,也有一些在线网站可以测试,比如[all8](https://www.all8.com/tools/bpm.htm)。
接下来一点十分重要那就是调节BPMBeats Per Minute每分钟节拍数只有设置对了BPM才能让游戏节奏和音乐速度保持一致。如果你在制作的曲目是匀速的可以使用一些软件如 [ArrowVortex](https://arrowvortex.ddrnl.com/),或是一些在线网站,比如[all8](https://www.all8.com/tools/bpm.htm)。
调整好BPM之后还需要调整偏移。我们看一下下面波形图案点击```+`两个按钮进行缩小和放大。

View File

@ -166,7 +166,7 @@
`轨道`从主轨道上**分割**出来,并旋转到`角度`度。
## 重排序:行
## 轨道重排序~~重排序:行~~
将轨道转移到其他房间,或者改变轨道的层级

View File

@ -1,6 +1,9 @@
# 视觉干扰
> 在关卡中出现对比度较高画面快速交替如红蓝、黑白快速闪烁必须开启癫痫警告。使用“放克”特效必须开启癫痫警告。使用“干扰”特效较多建议开启癫痫警告。一秒出现3次以上快速闪烁建议开启癫痫警告。
> 在关卡中出现对比度较高画面快速交替,如红蓝、黑白快速闪烁,必须开启癫痫警告。
> 使用“放克”特效,必须开启癫痫警告。
> 使用“干扰”特效较多,建议开启癫痫警告。
> 一秒出现3次以上快速闪烁建议开启癫痫警告。
> 即使开启了癫痫警告,也不要设计出会伤害视力的干扰效果。

View File

@ -236,91 +236,6 @@ function rdview() {
textarea.addEventListener("input", initCanvas);
}
function rdview2() {
let rdview = document.getElementsByClassName("rdview2")[0];
if (!rdview) return;
let rdcanvas = rdview.querySelector(".canvas");
let textarea = rdview.querySelector("textarea.area");
let number = rdview.querySelector(".number");
const textareaStyles = window.getComputedStyle(textarea);
[
"fontFamily",
"fontSize",
"fontWeight",
"letterSpacing",
"lineHeight",
"padding",
].forEach((property) => {
number.style[property] = textareaStyles[property];
});
const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
const font = `${textareaStyles.fontSize} ${textareaStyles.fontFamily}`;
context.font = font;
function calcStringLines(sentence, width) {
if (!width) return 0;
const words = sentence.split("");
let lineCount = 0;
let currentLine = "";
for (let i = 0; i < words.length; i++) {
const wordWidth = context.measureText(words[i]).width;
const lineWidth = context.measureText(currentLine).width;
if (lineWidth + wordWidth > width) {
lineCount++;
currentLine = words[i];
} else {
currentLine += words[i];
}
}
if (currentLine.trim() !== "") lineCount++;
return lineCount;
}
function calcLines() {
const lines = textarea.value.split("\n");
const textareaWidth = textarea.getBoundingClientRect().width;
const textareaScrollWidth = textareaWidth - textarea.clientWidth;
const parseNumber = (v) =>
v.endsWith("px") ? parseInt(v.slice(0, -2), 10) : 0;
const textareaPaddingLeft = parseNumber(textareaStyles.paddingLeft);
const textareaPaddingRight = parseNumber(textareaStyles.paddingRight);
const textareaContentWidth = textareaWidth - textareaPaddingLeft -
textareaPaddingRight - textareaScrollWidth;
const numLines = lines.map((lineString) =>
calcStringLines(lineString, textareaContentWidth)
);
let lineNumbers = [];
let i = 1;
while (numLines.length > 0) {
const numLinesOfSentence = numLines.shift();
lineNumbers.push(i);
if (numLinesOfSentence > 1) {
Array(numLinesOfSentence - 1)
.fill("")
.forEach((_) => lineNumbers.push(""));
}
i++;
}
return lineNumbers;
}
function initLineNumbers() {
const lines = calcLines();
const lineDoms = Array.from({
length: lines.length,
}, (_, i) => `<div>${lines[i] || "&nbsp;"}</div>`);
number.innerHTML = lineDoms.join("");
}
function initCanvas() {
const lang = textarea.value.split("\n")[0];
const code = textarea.value.split("\n").slice(1).join("\n");
rdcanvas.innerHTML = RDViewRender(lang, code);
}
initCanvas();
initLineNumbers();
textarea.addEventListener("input", initLineNumbers);
textarea.addEventListener("input", initCanvas);
}
function rdview2() {
let rdview = document.getElementsByClassName("rdview2")[0];
if (!rdview) return;