This commit is contained in:
OLDREDSTONE 2025-10-26 22:32:11 +08:00
parent 139f1eef71
commit 8faac81f8f
8 changed files with 132 additions and 90 deletions

View File

@ -43,6 +43,7 @@
.replace(/'/g, "'");
}
loadRDView()
const originalCodeRenderer = $docsify.markdown?.renderer?.code;
$docsify = {
...$docsify,
...{
@ -52,10 +53,10 @@
if (lang.trim().startsWith('rdview')) {
return RDViewRender(lang, code);
}
return `<pre data-lang="${lang}"><code>${escapeHtml(code)}</code></pre>`;
return originalCodeRenderer ? originalCodeRenderer(code, lang) : `<pre data-lang="${lang}"><code>${escapeHtml(code)}</code></pre>`;
},
image: function (src, title, alt) {
return `<div class="image-tip"><img class="medium-zoom-image" src="${src}" alt="${alt}">${alt?`<p>${alt}</p>`:""}</div>`;
return `<div class="image-tip"><img class="medium-zoom-image" src="${src}" alt="${alt}">${alt ? `<p>${alt}</p>` : ""}</div>`;
},
}
},
@ -85,7 +86,7 @@
<script src="/script/docsify-copy-code.min.js"></script>
<script src="/script/switchLightDarkMode.js"></script>
<script src="/script/otto.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1/components/prism-yaml.js"></script>
<script type="module" src="/script/special.js"></script>
</body>
</html>

View File

@ -15,14 +15,14 @@
2. 在 Visual Studio 中,依次点击 **工具** > **NuGet 包管理器** > **程序包管理器控制台**
3. 在控制台中输入以下命令:
```
```bash
Install-Package RhythmBase -Version 1.2.0-rc2
```
4. 等待安装完成,并确保项目已引用所需的 NuGet 包。
5. 如果使用 .NET CLI请输入
```
```bash
dotnet add package RhythmBase -version 1.2.0-rc2
```

View File

@ -1,5 +1,10 @@
# 更新信息
#### 2025-10-26
- 文档补充
- 修复代码块渲染异常
- 首页添加互动模块引导
#### 2025-10-18
- [自制角色与精灵资源](../pages/spritesheet.md)页添加了音效和表情命名规则相关内容。

View File

@ -5,7 +5,11 @@
# 节奏医生中文编辑器教程
> 此网页正在维护中。如有任何问题,欢迎指出。
> 此网页正在维护中。
网页已开源至[此处](https://git.obugs.cn/RDCNWebs/rd.rdlevel.cn),欢迎投稿。
> 页面内的大部分事件栏板块包含点击互动。尝试点击以获得更生动的演示。
也可以在[此处](../pages/appendix_tools.md)游玩事件栏板块。
《节奏医生》编辑器中文教程旨在以教学的形式帮助您快速了解编辑器的界面,基础功能,设计技巧和做谱规范。

View File

@ -1,4 +1,4 @@
# 普通拍的衍生节奏型
# 普通拍的衍生节奏型
## 分解为自由时长节拍
@ -85,7 +85,7 @@ eb.PulseFreeTimeBeat 8 1[pulse=9];
不要使用内置的 `sndBeepMid` 音效!
八拍子也可以是摇摆拍,只需要将所有偶数拍选择并拖动即可变成摇摆拍:
八拍子也可以是摇摆拍,只需要将所有偶数拍选择并拖动即可变成摇摆拍:
```rdview 10 3
eb.AddClassicBeat 1 0[tick=6,swing=0.5];
@ -99,7 +99,7 @@ eb.PulseFreeTimeBeat 7 1[pulse=9];
eb.PulseFreeTimeBeat 8.5 1[pulse=9];
```
在八拍子中,**激活拍子**与八拍子的对应关系如下图所示。不要给第1拍和第3拍设置X拍子这样做它就相当于变回普通拍了。
在八拍子中,**激活拍子**与八拍子的对应关系如下图所示。不要给第1拍和第3拍设置X拍子这样做它就相当于变回普通拍了。
![](../images/moreclassicbeats-8beat.png)

View File

@ -1,6 +1,6 @@
# 单发拍的衍生节奏型
# 单发拍的衍生节奏型
## 单发拍进阶用法
## 单发拍进阶用法
本小节的内容可能会稍显冗长和晦涩,希望大家能保持耐心多多琢磨。
@ -13,9 +13,9 @@ es.SayReadyGetSetGo_Go 5[];
eb.AddOneshotBeat 5 1[loop=1,tick=1.5,interval=4];
```
可以看到,虽然 Get-Set 与 Set-Go 之间的间隔不同,但依然保持了上述的对应关系。实际上,这就是`4-4`使用的单发拍
可以看到,虽然 Get-Set 与 Set-Go 之间的间隔不同,但依然保持了上述的对应关系。实际上,这就是`4-4`使用的单发拍。
`2-3`中也出现了摇摆单发拍,可以试着自己理解一下这关的单发拍提示:
`2-3`中也出现了摇摆单发拍,可以试着自己理解一下这关的单发拍提示:
```rdview 10 2
eb.AddOneshotBeat 1[];
@ -26,7 +26,7 @@ eb.AddOneshotBeat 7[tick=0.75];
eb.AddOneshotBeat 8[tick=0.75];
```
如果我们在此基础上更进一步,会发生什么呢?来看看`4-4N`中出现过的这段单发拍
如果我们在此基础上更进一步,会发生什么呢?来看看`4-4N`中出现过的这段单发拍:
```rdview 12 4
g 1 1 4 2[offset=4]{
@ -45,11 +45,11 @@ eb.AddOneshotBeat 9[tick=0.75];
eb.AddOneshotBeat 10.5[tick=0.75];
```
可以看到,图中的单发拍已不再局限于一个单发拍不断重复了,而是变成了若干个单发拍构成的单发拍组的不断重复,但前面讲过的与护士提示之间的对应关系仍保持不变。由此我们可以得到单发拍的核心规则:
可以看到,图中的单发拍已不再局限于一个单发拍不断重复了,而是变成了若干个单发拍构成的单发拍组的不断重复,但前面讲过的与护士提示之间的对应关系仍保持不变。由此我们可以得到单发拍的核心规则:
单发拍本质上是对一段节奏(循环节)的不断重复,这段节奏可以由一个或多个单发拍构成。在单发拍开始之前,会使用护士提示,以 Rea、Dy、Get、Set 的形式,重复一次(或多次)这段单发拍循环节,并在最后用 Go 表示单发拍的开始。
单发拍本质上是对一段节奏(循环节)的不断重复,这段节奏可以由一个或多个单发拍构成。在单发拍开始之前,会使用护士提示,以 Rea、Dy、Get、Set 的形式,重复一次(或多次)这段单发拍循环节,并在最后用 Go 表示单发拍的开始。
当对一段较为复杂的单发拍进行提示的时候,由于循环节由多个单发拍组成,护士必然会提示多个脉冲和按拍的位置,这时仍然需要遵循只在最后一对脉冲和按拍处使用 Get Set其余部分均使用 Rea Dy。
当对一段较为复杂的单发拍进行提示的时候,由于循环节由多个单发拍组成,护士必然会提示多个脉冲和按拍的位置,这时仍然需要遵循只在最后一对脉冲和按拍处使用 Get Set其余部分均使用 Rea Dy。
```rdview 13 4
g 1 1 4 2[offset=4]{
@ -77,11 +77,11 @@ eb.AddOneshotBeat 12[tick=0.5];
## 复杂脉冲
正如`2-1`所说的那样,单发拍的脉冲位置并不重要,只要保证按拍位置不变,脉冲位置是可以任意变化的。
正如`2-1`所说的那样,单发拍的脉冲位置并不重要,只要保证按拍位置不变,脉冲位置是可以任意变化的。
同时,一个单发拍也可能拥有不止一个脉冲。若要实现这种效果,只需将几个单发拍的尾端对齐,首端放在不同位置即可。
同时,一个单发拍也可能拥有不止一个脉冲。若要实现这种效果,只需将几个单发拍的尾端对齐,首端放在不同位置即可。
以下单发拍均是合法的:
以下单发拍均是合法的:
```rdview 9 2
eb.AddOneshotBeat 1[];
@ -96,9 +96,9 @@ eb.AddOneshotBeat 7.5[tick=0.5];
但这样一来前面所说的“Rea、Get 对应单发拍脉冲”就没有意义了吗其实不然Rea、Get 的作用如下:
1. 护士提示的第一个词必然是 Rea 或 Get也就意味着这个词代表单发拍循环节的开始,与末尾的 Go 对应。
1. 护士提示的第一个词必然是 Rea 或 Get也就意味着这个词代表单发拍循环节的开始与末尾的 Go 对应。
2. Rea、Get 可以辅助玩家掌握单发拍的节奏型。在实际游玩中,玩家通常是会以 Rea、Get 为基础来进行单发拍的演奏的。所以通常要使 Rea、Get 契合音乐或节拍设计,来达到方便玩家记忆或丰富游戏体验的效果。
2. Rea、Get 可以辅助玩家掌握单发拍的节奏型。在实际游玩中,玩家通常是会以 Rea、Get 为基础来进行单发拍的演奏的。所以通常要使 Rea、Get 契合音乐或节拍设计,来达到方便玩家记忆或丰富游戏体验的效果。
举个例子Rea-Dy-Get-Set-Go 与 Rea-Dy--GetSet-Go尽管两者的按拍时机相同但不同的 Rea、Get 位置会给人带来不同的游玩体验。
@ -134,13 +134,13 @@ g 1 4 4 1 [offset=4]{
};
```
## 跳过单发拍
## 跳过单发拍
游戏在`2-1N`中引入了一种全新的单发拍机制:跳过单发拍。这种单发拍的规则很简单:跳过单发拍之后的一次单发拍按拍会被跳过。跳过单发拍无需手动添加提示,只需在单发拍修饰符中选择跳过单发拍,相关的视效与音效提示会被自动添加到关卡中。
游戏在`2-1N`中引入了一种全新的单发拍机制:跳过单发拍。这种单发拍的规则很简单:跳过单发拍之后的一次单发拍按拍会被跳过。跳过单发拍无需手动添加提示,只需在单发拍修饰符中选择跳过单发拍,相关的视效与音效提示会被自动添加到关卡中。
当然,在被跳过的单发拍的这段空白时间里,也可以放置多个单发拍脉冲,以丰富谱面的节奏设计。跳过拍的“间隔”参数会影响跳过符号的动画时长。
当然,在被跳过的单发拍的这段空白时间里,也可以放置多个单发拍脉冲,以丰富谱面的节奏设计。跳过拍的“间隔”参数会影响跳过符号的动画时长。
需要注意的是,跳过单发拍会跳过下一次**击拍**,而不是下一个循环节。
需要注意的是,跳过单发拍会跳过下一次**击拍**,而不是下一个循环节。
```rdview 7 4
eb.AddOneshotBeat 1[type=skipshot];
@ -152,19 +152,19 @@ eb.AddOneshotBeat 4.5 2[tick=1.5];
eb.AddOneshotBeat 5.25 2[tick=0.75];
```
另外,在剧情关卡中,跳过拍的位置如果按下空格会计算成失误,但编辑器中默认是不会失误的。
另外,在剧情关卡中,跳过拍的位置如果按下空格会计算成失误,但编辑器中默认是不会失误的。
## 方块单发拍
## 方块单发拍
常规的单发拍是针对一个节奏型的不断重复,而**方块单发拍**是“一次性”的单发拍,即没有重复,只需按拍一次。
常规的单发拍是针对一个节奏型的不断重复,而**方块单发拍**是“一次性”的单发拍,即没有重复,只需按拍一次。
方块单发拍最早出现于`MD-1`,在第五章更新后也出现在了`5-X`用于预警细分拍的出现。
方块单发拍最早出现于`MD-1`,在第五章更新后也出现在了`5-X`用于预警细分拍的出现。
选中一个单发拍,在修饰符中选择方块符号`◇`,将细分数量设为 1 ,便创建了一个方块单发拍。方块单发拍出现时需要添加特殊音效,在方块单发拍的声音栏选择“特殊”即可自动添加提示音。
选中一个单发拍,在修饰符中选择方块符号`◇`,将细分数量设为 1 ,便创建了一个方块单发拍。方块单发拍出现时需要添加特殊音效,在方块单发拍的声音栏选择“特殊”即可自动添加提示音。
![](../images/moreoneshotbeats-subdivision.png)
除此之外,方块单发拍也需要护士提示。这种护士提示与普通单发拍的提示类似,唯一的不同点在于最后的 Go 被替换为了 One。
除此之外,方块单发拍也需要护士提示。这种护士提示与普通单发拍的提示类似,唯一的不同点在于最后的 Go 被替换为了 One。
```rdview 5 3
eb.AddOneshotBeat 3[];
@ -173,15 +173,15 @@ es.SayReadyGetSetGo_Set 2 1[];
es.SayReadyGetSetGo_Go 3 1[];
```
如果相同拍长的方块单发拍连续出现了多次,无需为每次出现添加完整的护士提示。可以逐步减少护士提示,直到完全没有护士提示,只剩下特殊提示音。
如果相同拍长的方块单发拍连续出现了多次,无需为每次出现添加完整的护士提示。可以逐步减少护士提示,直到完全没有护士提示,只剩下特殊提示音。
## 细分拍
## 细分拍
与方块单发拍的概念类似,**细分拍**也是“一次性”的单发拍,但是会产生多次等间距的心跳脉冲,按键的次数也变为多次。
与方块单发拍的概念类似,**细分拍**也是“一次性”的单发拍,但是会产生多次等间距的心跳脉冲,按键的次数也变为多次。
细分拍最早出现于`MD-1`,当时官方谱面没有官方名称,且最多仅有两个三角拍;后来第五章更新后三角拍首次出现在`5-1`并正式更名为**细分拍**,并出现了多个细分。
细分拍最早出现于`MD-1`,当时官方谱面没有官方名称,且最多仅有两个三角拍;后来第五章更新后三角拍首次出现在`5-1`并正式更名为**细分拍**,并出现了多个细分。
在修饰符中选择方块后,将细分数量设为大于 1 的值或者点击细分符号`△`,即可创建细分拍。特殊音效的添加与方块单发拍类似。最多可以将细分数量设置为 10 。
在修饰符中选择方块后,将细分数量设为大于 1 的值或者点击细分符号`△`,即可创建细分拍。特殊音效的添加与方块单发拍类似。最多可以将细分数量设置为 10 。
![](../images/moreoneshotbeats-amountofsubdivision.png)
@ -192,7 +192,7 @@ eb.AddOneshotBeat 1 2[type=subdivision,subdivision=4];
eb.AddOneshotBeat 1 3[type=subdivision,subdivision=5];
```
在护士提示方面,不同于方块单发拍,细分拍需要在出拍前的半拍长开始数拍提示。
在护士提示方面,不同于方块单发拍,细分拍需要在出拍前的半拍长开始数拍提示。
```rdview 13
eb.AddOneshotBeat 1[type=subdivision,subdivision=2];
@ -219,13 +219,13 @@ g 8 1 1 1[offset=1]{
![](../images/moreoneshotbeats-setnursesay.png)
> 注意:非必要情况下,不要关闭方块单发拍和细分拍本身的声音。这对于仅靠听觉游玩的玩家而言是必要的。
> 注意:非必要情况下,不要关闭方块单发拍和细分拍本身的声音。这对于仅靠听觉游玩的玩家而言是必要的。
### 单独的细分拍
### 单独的细分拍
`MD-1` 一样,你可以通过 `Rea Dy Get Set Two~Ten` 来提示单独出现的细分 2 至细分 10 。
单独细分的提示**与正常单发拍的提示类似**Rea Dy 或 Get Set 之间的间隔同样用于提示细分拍的拍长,且数字提示**和 Go! 提示一样不需要提前**。
单独细分的提示**与正常单发拍的提示类似**Rea Dy 或 Get Set 之间的间隔同样用于提示细分拍的拍长,且数字提示**和 Go! 提示一样不需要提前**。
```rdview 14 3
eb.AddOneshotBeat 3[type=subdivision,subdivision=2];
@ -238,13 +238,13 @@ es.SayReadyGetSetGo_Set 7 1[];
es.SayReadyGetSetGo_4 9 1[];
```
## 冻结拍🧊
## 冻结拍🧊
**冻结拍**会将单发拍冻住,使下一拍相比正常按拍位置延后一些。
**冻结拍**会将单发拍冻住,使下一拍相比正常按拍位置延后一些。
冻结拍很早就存在于编辑器中,但尚未在官方关卡出现,第五章更新后终于在`5-2`首次露面,并且有了新的特效。
冻结拍很早就存在于编辑器中,但尚未在官方关卡出现,第五章更新后终于在`5-2`首次露面,并且有了新的特效。
在修饰符中选中冰块符号`🧊`,就创建了一个冻结拍。创建一个冻结拍后,会多出“延迟”与“间隔”选项,同时相比于更新前,冻结拍在编辑器内的样式也有所变化。
在修饰符中选中冰块符号`🧊`,就创建了一个冻结拍。创建一个冻结拍后,会多出“延迟”与“间隔”选项,同时相比于更新前,冻结拍在编辑器内的样式也有所变化。
![](../images/moreoneshotbeats-freezeshot.png)
@ -253,25 +253,25 @@ eb.AddOneshotBeat 2[type=freezeshot,delay=0.5,interval=2];
eb.AddOneshotBeat 5[type=freezeshot,delay=0.5,interval=2,tick=2];
```
对于一个冻结拍而言,一共有五个关键的时间点:左十字,右十字,出拍点(绿线),原按拍点(蓝线),实际按拍点(黄线)。
对于一个冻结拍而言,一共有五个关键的时间点:左十字,右十字,出拍点(绿线),原按拍点(蓝线),实际按拍点(黄线)。
```rdview 4 2
eb.AddOneshotBeat 2[type=freezeshot,delay=0.5,interval=2];
```
- **左十字**和**右十字**会显示两次冰冻特效并分别播放不同的冰冻音效,用于预示拍延长的时间。
- **左十字**和**右十字**会显示两次冰冻特效并分别播放不同的冰冻音效,用于预示拍延长的时间。
- **绿线**代表单发拍会在此响一次。
- **蓝线**处会将人物冻成冰块,再显示一次冰冻特效并播放一次冰冻音效,表示拍延长的开始。
- **黄线**处拍会解冻并播放最后一次冰冻音效,也是玩家应该按拍的时机。
- **蓝线**处会将人物冻成冰块,再显示一次冰冻特效并播放一次冰冻音效,表示拍延长的开始。
- **黄线**处拍会解冻并播放最后一次冰冻音效,也是玩家应该按拍的时机。
- **绿线**与**蓝线**之间的间隔就是`拍长`的时间。
- **左十字**与**右十字**或者**蓝线**与**黄线**之间的间隔就是`延迟`的时间。
- **左十字**与**蓝线**或者**右十字**与**黄线**之间的间隔就是`间隔`的时间。
- 以前由于冻结拍尚不完善导致**绿线**不允许夹在**两个十字**之间,现在这种操作已经允许了。
- 以前由于冻结拍尚不完善导致**绿线**不允许夹在**两个十字**之间,现在这种操作已经允许了。
若设计冻结拍,还必须满足以下两个时间点正确:
若设计冻结拍,还必须满足以下两个时间点正确:
- **蓝线**所在时间应在正常单发拍的按拍位置上;
- **左十字**必须和上一个普通单发拍的按拍位置重合。
- **蓝线**所在时间应在正常单发拍的按拍位置上;
- **左十字**必须和上一个普通单发拍的按拍位置重合。
```rdview 5 3
eb.AddOneshotBeat 1[];
@ -280,32 +280,44 @@ eb.AddOneshotBeat 1 1[grayscale=100,offset_grayscale=80];
eb.AddOneshotBeat 3 1[grayscale=100,offset_grayscale=80];
```
## 灼热拍子🔥
如果需要在冻结拍上叠加多个拍子来凸显鼓点,可以将他们的按拍点放在同一位置。
与**冻结拍子**相反,**灼热拍子**会形成一股热浪,使下一拍的按拍位置提前一些。
```rdview 5 3
eb.AddOneshotBeat 2[type=freezeshot,delay=0.5,interval=2];
g 2 -1 2 2 #0000[offset=0 1]{
eb.AddOneshotBeat 0.5 1[];
g 0 -2 2 3 #0000[offset=0 1]{
eb.AddOneshotBeat -1 3[tick=2.5];
};
};
```
第五章更新后,灼热拍子在`5-2N`首次出现。
## 灼热拍🔥
在修饰符中选中火焰符号`🔥`,就创建了一个灼热拍子。创建一个灼热拍子后,会多出“间隔”选项。
与**冻结拍**相反,**灼热拍**会形成一股热浪,使下一拍的按拍位置提前一些。
第五章更新后,灼热拍在`5-2N`首次出现。
在修饰符中选中火焰符号`🔥`,就创建了一个灼热拍。创建一个灼热拍后,会多出“间隔”选项。
![](../images/moreoneshotbeats-burnshot.png)
类似地,对于一个灼热拍子,一共有四个关键的时间点:左十字,右十字,出拍点(绿线),按拍点。为作区分且方便表述,将会把按拍点称为红线。
类似地,对于一个灼热拍,一共有四个关键的时间点:左十字,右十字,出拍点(绿线),按拍点。为作区分且方便表述,将会把按拍点称为红线。
```rdview 5 2
eb.AddOneshotBeat 3[tick=0.5,type=burnshot,interval=2];
```
- **左十字**和**右十字**会显示两次热浪特效并分别播放不同的灼热音效,用于预示拍实际的时间。
- **左十字**和**右十字**会显示两次热浪特效并分别播放不同的灼热音效,用于预示拍实际的时间。
- **绿线**处会再显示一次热浪特效并播放一次灼热特效,同时单发拍会在此响一次。
- **红线**处拍会解除灼热状态并播放最后一次灼热音效,也是玩家应该按拍的时机。
- **红线**处拍会解除灼热状态并播放最后一次灼热音效,也是玩家应该按拍的时机。
- **左十字**与**右十字**或者**绿线**与**红线**之间的间隔就是`拍长`的时间。
- **左十字**与**绿线**或者**右十字**与**红线**之间的间隔就是`间隔`的时间。
若设计灼热拍,还必须满足以下两个时间点正确:
若设计灼热拍,还必须满足以下两个时间点正确:
- **绿线**所在时间应在正常单发拍的原定出拍位置上;
- **左十字**必须和上一个普通单发拍的原定出拍位置重合。
- **绿线**所在时间应在正常单发拍的原定出拍位置上;
- **左十字**必须和上一个普通单发拍的原定出拍位置重合。
```rdview 5 3
eb.AddOneshotBeat 1[];
@ -314,7 +326,19 @@ eb.AddOneshotBeat 1 1[grayscale=100,offset_grayscale=80];
eb.AddOneshotBeat 3 1[grayscale=100,offset_grayscale=80];
```
最后我们针对细分拍子、冻结拍子、灼热拍子做一个技术总结:
如果需要在灼热拍上叠加多个拍子来凸显鼓点,可以将他们的按拍点放在同一位置。
```rdview 5 3
eb.AddOneshotBeat 2[type=burnshot,delay=0.5,interval=2];
g 0 -1 3 2 #0000[offset=0 1]{
eb.AddOneshotBeat 1.5 1[tick=1.5];
g 0 -1 3 3 #0000[offset=0 1]{
eb.AddOneshotBeat 0.5 2[tick=2.5];
};
};
```
最后我们针对细分拍、冻结拍、灼热拍做一个技术总结:
```rdview 19 7
eb.AddOneshotBeat 1[loop=1];
@ -346,28 +370,28 @@ g 13 5 1 1[offset=1]{
};
```
## 冲击拍
## 冲击拍
**冲击拍**属于一种单发拍,但在通常情况下相比正常的单发拍而言更快,护士在喊口令的同时会伴有新的哨声提示。
**冲击拍**属于一种单发拍,但在通常情况下相比正常的单发拍而言更快,护士在喊口令的同时会伴有新的哨声提示。
第五章更新后,冲击拍`5-X`首次出现。虽然`2-2`中最快的单发拍也相当快,但并不属于冲击拍
第五章更新后,冲击拍在`5-X`首次出现。虽然`2-2`中最快的单发拍也相当快,但并不属于冲击拍。
冲击拍的本质是**护士提示带有哨声的单发拍****正拍按拍**以及**快速**是其显著特征,这两点在`5-X`中也有所体现。
冲击拍的本质是**护士提示带有哨声的单发拍****正拍按拍**以及**快速**是其显著特征,这两点在`5-X`中也有所体现。
冲击拍除了正常的护士提示之外,开始前后还会分别会伴随四声哨子,顺序分别为**短低短低**和**高高高高**,每声哨子之间的间隔相同,且四声哨子 - 高音效与前四下按拍重合,如下图上半部分。
冲击拍除了正常的护士提示之外,开始前后还会分别会伴随四声哨子,顺序分别为**短低短低**和**高高高高**,每声哨子之间的间隔相同,且四声哨子 - 高音效与前四下按拍重合,如下图上半部分。
同时,仅当面临如下图下半部分特定的冲击像正常单发拍转化时,最后三个冲击拍的按拍会伴随三声哨子,顺序分别为**高高低**。
同时,仅当面临如下图下半部分特定的冲击像正常单发拍转化时,最后三个冲击拍的按拍会伴随三声哨子,顺序分别为**高高低**。
![](../images/moreoneshotbeats-blastbeat.png)
![](/images/13-23.png)
*请注意,灰色的护士提示事件只是为了方便理解单发拍机制,实际只需要放置红色护士语音事件即可。*
虽然`5-X`引入了冲击拍,但有几点仍需注意:
1. **冲击拍依旧是一种单发拍**,其护士提示方式与正常拍长的单发拍基本无异,只不过在拍长较短时需要多加两个 Rea Dy 延长预先提示。
2. **冲击拍并没有正拍按拍以及高速度的强制要求**,只要是一组循环的单发拍,无论正反拍都可以加上哨声提示当作冲击拍使用,只需注意使用场景、合理性与便捷性。
3. 哨声虽然是判定冲击拍的指标,但是**这只是一种新的提示方式**,只是为了让玩家更好地应对单发拍,请勿为了创造冲击拍而随意添加哨声堆砌提示,否则会显得相当冗杂。
虽然`5-X`引入了冲击拍,但有几点仍需注意:
1. **冲击拍依旧是一种单发拍**,其护士提示方式与正常拍长的单发拍基本无异,只不过在拍长较短时需要多加两个 Rea Dy 延长预先提示。
2. **冲击拍并没有正拍按拍以及高速度的强制要求**,只要是一组循环的单发拍,无论正反拍都可以加上哨声提示当作冲击拍使用,只需注意使用场景、合理性与便捷性。
3. 哨声虽然是判定冲击拍的指标,但是**这只是一种新的提示方式**,只是为了让玩家更好地应对单发拍,请勿为了创造冲击拍而随意添加哨声堆砌提示,否则会显得相当冗杂。
简言之,冲击拍并不是什么新东西,只是加了哨子提示的单发拍,仅此而已。尽管在`5-X`里其速度和正反按拍切换令人印象深刻,但只需像正常单发拍一样使用即可。
简言之,冲击拍并不是什么新东西,只是加了哨子提示的单发拍,仅此而已。尽管在`5-X`里其速度和正反按拍切换令人印象深刻,但只需像正常单发拍一样使用即可。
总的来说,冲击拍只是为了符合`5-X`剧情而设计的机制,其提示方式相较于正常单发拍更为复杂,如果有需要可以添加哨声提示以创造出冲击拍,但是只使用护士语音提示也是完全合理的,需根据个人需求进行选择。~~虽然我不推荐用就是了,提示整得那么麻烦还容易出错。~~
总的来说,冲击拍只是为了符合`5-X`剧情而设计的机制,其提示方式相较于正常单发拍更为复杂,如果有需要可以添加哨声提示以创造出冲击拍,但是只使用护士语音提示也是完全合理的,需根据个人需求进行选择。~~虽然我不推荐用就是了,提示整得那么麻烦还容易出错。~~

View File

@ -29,9 +29,9 @@
可写变量与只读变量类似,其参数可以随游戏进程变化,与只读变量不同的是,可写变量的值可人为更改。可写变量大致可分为三类:
> 1. **整型**int整型变量可以存储整数变量名写作i0、i1、...、i9。
> 2. **浮点型**float浮点型变量可以存储浮点数也就是小数。特别地形如1.0的值为浮点数变量名写作f0、f1、...、f9。
> 3. **布尔型**boolean, 也可简写为 bool布尔型变量可以存储布尔值。布尔值包含且仅包含True和False。布尔型变量名写作b0、b1、...、b9。
- **整型**int整型变量可以存储整数变量名写作i0、i1、...、i9。
- **浮点型**float浮点型变量可以存储浮点数也就是小数。特别地形如1.0的值为浮点数变量名写作f0、f1、...、f9。
- **布尔型**boolean/bool布尔型变量可以存储布尔值。布尔值包含且仅包含True和False。布尔型变量名写作b0、b1、...、b9。
需要注意的是上述三类变量每类有且仅有所列举的10个且无法修改变量名。一般地整形变量的值属于区间[-2147483648, 2147483647],而浮点型变量取值范围相对广泛。
@ -55,14 +55,24 @@
| < | 小于 |
| > | 大于 |
> 为了保留更高的兼容性,参与计算的数据都会转换为浮点数,也就意味着:
> - int 和 bool 实际上都会转换为 float
> - 转换为 int 的操作是四舍五入,并且偏好于最临近的偶数,例如:
> - `i0 = 2.75` => i0: 3
> - `i0 = 2.5` => i0: 2
> - `i0 = 3.5` => i0: 4
> - 转换为 bool 的操作是非 0 即为 True例如
> - `b0 = -3` => b0: True
> - `b0 = -0.0` => b0: False
变量可以在调用自定义方法;浮动文字、显示对话、显示状态牌;条件中使用。
> 1. **调用自定义方法**
> 可以在调用自定义方法的表达式框里对变量进行读写、赋值,可使用赋值运算符。
> 例如i1++使i1的值+1i4=4将i4的值赋为4
> 2. **浮动文字、显示对话、显示状态牌**
> 变量可以嵌入到这些事件的显示内容中,使用时将表达式用大括号包裹起来,可使用算数运算符连接。
> 例如:“武士有{i0}个朋友,洛根比武士多{i1}个朋友,所以洛根有{i0+i1}个朋友。”这句话在i0==4且i1==6时输出为“武士有4个朋友洛根比武士多6个朋友所以洛根有10个朋友。”
> 3. **条件**
> 变量可用于自定义类型条件的表达式框中。通常与比较运算符结合使用。
> 例如i0==10i0等于10、i5<i0i5小于i0
- **调用自定义方法**
可以在调用自定义方法的表达式框里对变量进行读写、赋值,可使用赋值运算符。
例如i1++使i1的值+1i4=4将i4的值赋为4
- **浮动文字、显示对话、显示状态牌**
变量可以嵌入到这些事件的显示内容中,使用时将表达式用大括号包裹起来,可使用算数运算符连接。
例如:“武士有{i0}个朋友,洛根比武士多{i1}个朋友,所以洛根有{i0+i1}个朋友。”这句话在i0==4且i1==6时输出为“武士有4个朋友洛根比武士多6个朋友所以洛根有10个朋友。”
- **条件**
变量可用于自定义类型条件的表达式框中。通常与比较运算符结合使用。
例如i0==10i0等于10、i5\<i0i5小于i0

View File

@ -88,7 +88,6 @@ function plugin(hook, vm) {
currentThemeModeIndex = parseInt(window.localStorage.getItem('currentThemeModeIndex'))
}
window.$docsify.currentThemeModeIndex = currentThemeModeIndex
console.log(window.localStorage)
setThemeMode(themeModes[currentThemeModeIndex])
window.localStorage.setItem('currentThemeModeIndex', currentThemeModeIndex)
if (window.$docsify.onLightDarkModeChange) {
@ -118,7 +117,6 @@ function plugin(hook, vm) {
window.$docsify.currentThemeModeIndex = currentThemeModeIndex
setThemeMode(themeModes[currentThemeModeIndex])
window.localStorage.setItem('currentThemeModeIndex', currentThemeModeIndex)
console.log('currentThemeModeIndex', window.localStorage.getItem('currentThemeModeIndex'))
if (window.$docsify.onLightDarkModeChange) {
window.$docsify.onLightDarkModeChange();
}