forked from RDCNWebs/rd.rdlevel.cn
195 lines
9.4 KiB
Markdown
195 lines
9.4 KiB
Markdown
# 05 单发拍子
|
||
|
||
## 单发拍子功能介绍
|
||
|
||
节奏医生中的节拍大体上可以分为两类:普通拍与单发拍,本节我们看看单发拍子如何使用。我们创建一个角色,轨道类型选择“**单发**”,将这条轨道变为单发拍子轨道。单发拍子对应的英文是“OneShot”。
|
||
|
||

|
||
|
||
在空白处随便点一下,就会生成一个单发拍子,并且在屏幕左上角出现一些设置。
|
||
|
||

|
||
|
||
**拍长**指的是下图中每一组绿线到黄线之间的长度,默认值为`1`。更改数值就会改变拍长,也可以在工作区中直接拖动单发拍子首尾两端来改变,或是通过`Ctrl+鼠标滚轮`来调整拍长。
|
||
|
||
在“**循环**”的空栏里输入次数,这个单发拍就会被**额外**重复这么多次。当然了,直接输入循环次数的方法并不够方便,因为很多时候不听具体音乐自己也不知道该循环多少次。更方便的方法是,把鼠标移动到工作区的这个单发拍子上,右上角就会出现一个**红色的箭头符号**,按住它并拖动即可。
|
||
|
||
```rdview 7 3
|
||
eb.AddOneshotBeat 1 1[tick=1,loop=2];
|
||
```
|
||
|
||
在循环设置后,左上角又会多出一个“**间隔**”的设置,指的是两个绿线之间的时间长度。大多数时候,我们会将间隔设为拍长的两倍,这也就构成了一个普通单发拍子。但如果你想设计更为复杂的单发拍子节奏型,也可以试着将间隔改为其他数值:例如,把间隔改成`1`,拍长改成`0.75`,就变成了一种摇摆单发拍子。
|
||
|
||
```rdview 10 3
|
||
eb.AddOneshotBeat 1 1[loop=1];
|
||
eb.AddOneshotBeat 5 1[tick=0.75,loop=3,interval=1];
|
||
```
|
||
|
||
配置好带有循环的单发拍之后,按一下“**分解为单发节拍**”,会发现它被拆散成了若干个没有循环的单发拍事件。分解后的单发拍更加便于修改,你可以为它们单独添加修饰符或额外的脉冲。
|
||
|
||
## 单发拍子护士提示
|
||
|
||
单发拍子与普通拍子不同之处在于,普通拍子可以观察前六次脉冲,推测出第七拍的正确按键时机;但单发拍子只有一次脉冲,玩家无法仅通过单发拍子的脉冲得知按键时机。因此,为了能让玩家正确击打单发拍子,**必须为单发拍子添加护士提示**。
|
||
|
||

|
||
|
||
要添加护士提示,我们需要切换到红色版块,并创建一个**护士语音设置**事件。
|
||
|
||
**护士应当说什么?**里,可以选择想让护士说的话。对于一个普通单发拍子,通常会使用`Get, Set, Go!`或`Rea, Dy, Get, Set, Go!`进行提示,速度较快时建议选择后者。
|
||
|
||
**语音**选项可以任选,但最好保证前后语音的一致性。列表最下面的“无-顶部/底部灯光”是为自定义提示或其他特殊用法准备的,不能单独作为单发拍提示。
|
||
|
||
将护士语音的拍长与单发拍的拍长保持一致,并将护士**喊出`Go!`的位置**与 **第一个普通单发拍的脉冲位置** 对齐即可,这样就完成了对一个普通单发拍的提示。
|
||
|
||
```rdview 16 12
|
||
eb.AddOneshotBeat 5 1[tick=2];
|
||
eb.AddOneshotBeat 9 1[tick=2];
|
||
eb.AddOneshotBeat 13 1[tick=2];
|
||
g 1 2 4 1[offset=4 0]{
|
||
g 0 -1 0 2 #0f08{
|
||
es.SayReadyGetSetGo_Get 0 1;
|
||
};
|
||
g 2 -1 0 2 #ff08{
|
||
es.SayReadyGetSetGo_Set 0 1;
|
||
};
|
||
g 4 -1 0 2 #f008{
|
||
es.SayReadyGetSetGo_Go 0 1;
|
||
};
|
||
};
|
||
eb.AddOneshotBeat 5 4;
|
||
eb.AddOneshotBeat 7 4;
|
||
eb.AddOneshotBeat 9 4;
|
||
eb.AddOneshotBeat 11 4;
|
||
eb.AddOneshotBeat 13 4;
|
||
g 1 5 4 2[offset=4 0]{
|
||
es.SayReadyGetSetGo_ReaDyGetSetGo 0 0;
|
||
g 0 -1 0 3 #0f08{
|
||
es.SayReadyGetSetGo_Rea 0 2;
|
||
};
|
||
g 1 -1 0 3 #ff08{
|
||
es.SayReadyGetSetGo_Dy 0 2;
|
||
};
|
||
g 2 -1 0 3 #0f08{
|
||
es.SayReadyGetSetGo_Get 0 2;
|
||
};
|
||
g 3 -1 0 3 #ff08{
|
||
es.SayReadyGetSetGo_Set 0 2;
|
||
};
|
||
g 4 -1 0 3 #F008{
|
||
es.SayReadyGetSetGo_Go 0 2;
|
||
};
|
||
};
|
||
eb.AddOneshotBeat 5 8[tick=0.5];
|
||
eb.AddOneshotBeat 6 8[tick=0.5];
|
||
eb.AddOneshotBeat 7 8[tick=0.5];
|
||
eb.AddOneshotBeat 8 8[tick=0.5];
|
||
eb.AddOneshotBeat 9 8[tick=0.5];
|
||
eb.AddOneshotBeat 10 8[tick=0.5];
|
||
eb.AddOneshotBeat 11 8[tick=0.5];
|
||
eb.AddOneshotBeat 12 8[tick=0.5];
|
||
eb.AddOneshotBeat 13 8[tick=0.5];
|
||
eb.AddOneshotBeat 14 8[tick=0.5];
|
||
g 1 9 4 2[offset=4 0]{
|
||
g 0 -1 0 2 #0f08{
|
||
es.SayReadyGetSetGo_Rea 0 1;
|
||
};
|
||
g 0.5 -1 0 3 #ff08{
|
||
es.SayReadyGetSetGo_Dy 0 2;
|
||
};
|
||
g 1 -1 0 2 #0f08{
|
||
es.SayReadyGetSetGo_Rea 0 1;
|
||
};
|
||
g 1.5 -1 0 3 #ff08{
|
||
es.SayReadyGetSetGo_Dy 0 2;
|
||
};
|
||
g 2 -1 0 2 #0f08{
|
||
es.SayReadyGetSetGo_Rea 0 1;
|
||
};
|
||
g 2.5 -1 0 3 #ff08{
|
||
es.SayReadyGetSetGo_Dy 0 2;
|
||
};
|
||
g 3 -1 0 2 #0f08{
|
||
es.SayReadyGetSetGo_Get 0 1;
|
||
};
|
||
g 3.5 -1 0 3 #ff08{
|
||
es.SayReadyGetSetGo_Set 0 2;
|
||
};
|
||
g 4 -1 0 2 #F008{
|
||
es.SayReadyGetSetGo_Go 0 1;
|
||
};
|
||
};
|
||
```
|
||
|
||
但是为什么要这样摆放护士提示?将护士提示**分解为独立事件**,如上图中“独立的形式”所示,让我们研究一下护士提示的各个组成部分。
|
||
|
||
## 单发拍子提示原理
|
||
|
||
护士提示本质上是在单发拍子开始之前请护士用语音为玩家演示了一遍单发拍子的脉冲时机(Get)与按拍时机(Set),并在最后用 Go 告知玩家单发拍子的开始。而玩家只需要按照护士的提示,在脑中不断重复“Get Set Go(Get) Set Go(Get) Set”,并以这个节奏按拍即可。
|
||
|
||
而如果我们分解`Rea, Dy, Get, Set, Go!`,原理也是相同的。Rea和Get一样,用来标识单发拍脉冲位置;Dy和Set一样,用来对应单发拍按拍位置。如果还想让护士提示更多,就只在最后一组使用`Get`和`Set`,前面使用多次`Rea`和`Dy`,例如在`2-2`中的`Rea Dy Rea Dy Get Set Go!`。
|
||
|
||
也可以让单发拍子在几种拍速之间来回切换,提示方法与前面所讲的相同。只需要注意一点:单发拍子的节奏型应该在**Go!的瞬间**完成切换,Go之前的护士提示不会影响当前正在进行的单发拍子,而 Go 之后也不应再出现前一种单发拍子的节拍。
|
||
|
||
```rdview 20 5
|
||
eb.AddOneshotBeat 3 1;
|
||
eb.AddOneshotBeat 5 1;
|
||
eb.AddOneshotBeat 7 1[tick=0.5];
|
||
eb.AddOneshotBeat 8 1[tick=0.5];
|
||
eb.AddOneshotBeat 9 1[tick=0.5];
|
||
eb.AddOneshotBeat 10 1[tick=0.5];
|
||
eb.AddOneshotBeat 11 1;
|
||
eb.AddOneshotBeat 13 1;
|
||
eb.AddOneshotBeat 15 1[tick=0.75];
|
||
eb.AddOneshotBeat 16 1[tick=0.75];
|
||
eb.AddOneshotBeat 17 1[tick=0.75];
|
||
eb.AddOneshotBeat 18 1[tick=0.75];
|
||
es.SayReadyGetSetGo_Get 1 2;
|
||
es.SayReadyGetSetGo_Set 2 2;
|
||
es.SayReadyGetSetGo_Go 3 2;
|
||
es.SayReadyGetSetGo_Get 6 2;
|
||
es.SayReadyGetSetGo_Set 6.5 3;
|
||
es.SayReadyGetSetGo_Go 7 2;
|
||
es.SayReadyGetSetGo_Get 9 2;
|
||
es.SayReadyGetSetGo_Set 10 2;
|
||
es.SayReadyGetSetGo_Go 11 2;
|
||
es.SayReadyGetSetGo_Get 14 2;
|
||
es.SayReadyGetSetGo_Set 14.75 3;
|
||
es.SayReadyGetSetGo_Go 15 2;
|
||
```
|
||
|
||
一个单发拍子不可能无限循环下去,总会有停下来的时候,可以使用护士提示中的`Stop`告知玩家单发拍子的结束。通常情况下,应使`Stop`对齐单发拍子的**最后一次击拍位置**。
|
||
|
||
为了给玩家预留更多的反应时间并提升整体听感,可以在`Stop`前的任一合适位置额外放置一个`And`语音。但注意:由于整体的`And Stop!`语音的语速是固定的,无法与BPM保持一致,因此不建议使用。
|
||
|
||
如果单发拍子的停止时机足够符合直觉,可以省略单发拍子的Stop,但必须保证玩家下意识多打出的拍子不会判Miss。最稳妥的方法永远是为所有单发拍子的停止都添加 Stop 提示。
|
||
|
||
```rdview 10 3
|
||
eb.AddClassicBeat 2.5[tick=6];
|
||
eb.AddOneshotBeat 1 1[];
|
||
eb.AddOneshotBeat 3 1[];
|
||
eb.AddOneshotBeat 5 1[];
|
||
g 7 1 1 1{
|
||
eb.AddOneshotBeat[grayscale=100];
|
||
};
|
||
```
|
||
|
||
如果到目前位置的内容你都已经理解了,恭喜你,已经完全掌握了基本的单发拍子的使用方法。进阶单发拍子、复杂脉冲、方块拍子、细分拍子、冻结拍子、灼热拍子以及冲击拍子我们放在[单发拍子的衍生节奏型](../pages/moreoneshotbeats.md)。
|
||
|
||
## 单发拍子视觉效果
|
||
|
||
创建一个单发拍子,点击**切换到设置波**即可生成一个**设置单发波**事件,用于修改当前轨道上单发拍子的形状和大小。修改是立即生效的,会作用在轨道上已存在的单发拍与之后的所有单发拍上,因此可以通过紧密放置多个设置单发波事件来实现单发拍子脉冲大小逐渐变化的效果。
|
||
|
||

|
||

|
||
|
||
选中一个单发拍子,按住`Shift + H`,会发现多出了一个爱心脉冲的修饰符。启用这个修饰符,可以将单发拍的形状变成`2-X`结尾的超大爱心。
|
||
|
||

|
||
|
||
> 此外像`4-4`关的抖动轨道单发拍子,需调用自定义方法来完成,语句为`wobblyLines = true`。如果你还不明白自定义方法是什么,需要先翻到[自定义方法](../pages/custommethod.md)看看。考虑到这玩意问的人比较多,所以就先写在此处了。
|
||
|
||
## 演示关卡
|
||
|
||
最后依然是呈上一个示范谱面。
|
||
|
||
<div class="bv"><iframe src="https://player.bilibili.com/player.html?aid=209214426&page=2&autoplay=0" title="BPM 与偏移的校对教程" width="100%" height="100%" scrolling="no" frameborder="no" framespacing="0" allowfullscreen="true"></iframe></div> |