rd.rdlevel.cn/pages/moreoneshotbeats.md

20 KiB
Raw Blame History

单发拍的衍生节奏型

单发拍进阶用法

本小节的内容可能会稍显冗长和晦涩,希望大家能保持耐心多多琢磨。

我们前面说过,护士提示的 Rea 和 Get 对应脉冲Dy 和 Set 对应按拍Go 代表单发拍开始,这种规则当然不仅仅适用于普通单发拍。先来看一个简单的摇摆单发拍:

es.SayReadyGetSetGo_Get 1[];
es.SayReadyGetSetGo_Set 2.5[];
es.SayReadyGetSetGo_Go 5[];
eb.AddOneshotBeat 5 1[loop=1,tick=1.5,interval=4];

可以看到,虽然 Get-Set 与 Set-Go 之间的间隔不同,但依然保持了上述的对应关系。实际上,这就是4-4使用的单发拍。

2-3中也出现了摇摆单发拍,可以试着自己理解一下这关的单发拍提示:

eb.AddOneshotBeat 1[];
eb.AddOneshotBeat 3[];
eb.AddOneshotBeat 5[tick=0.75];
eb.AddOneshotBeat 6[tick=0.75];
eb.AddOneshotBeat 7[tick=0.75];
eb.AddOneshotBeat 8[tick=0.75];

如果我们在此基础上更进一步,会发生什么呢?来看看4-4N中出现过的这段单发拍:

g 1 1 4 2[offset=4]{
    es.SayReadyGetSetGo_Rea 0 0[];
    es.SayReadyGetSetGo_Dy 0.75 1[];
    es.SayReadyGetSetGo_Get 1.5 0[];
    es.SayReadyGetSetGo_Set 2.25 1[];
    es.SayReadyGetSetGo_Go 4 0[];
    g 0 -1 0.75 3 #0f8[]{};
    g 1.5 -1 0.75 3 #0f8[]{};
    g 4 -1 0 3 #0f8[]{};
};
eb.AddOneshotBeat 5[tick=0.75];
eb.AddOneshotBeat 6.5[tick=0.75];
eb.AddOneshotBeat 9[tick=0.75];
eb.AddOneshotBeat 10.5[tick=0.75];

可以看到,图中的单发拍已不再局限于一个单发拍不断重复了,而是变成了若干个单发拍构成的单发拍组的不断重复,但前面讲过的与护士提示之间的对应关系仍保持不变。由此我们可以得到单发拍的核心规则:

单发拍本质上是对一段节奏(循环节)的不断重复,这段节奏可以由一个或多个单发拍构成。在单发拍开始之前,会使用护士提示,以 Rea、Dy、Get、Set 的形式,重复一次(或多次)这段单发拍循环节,并在最后用 Go 表示单发拍的开始。

当对一段较为复杂的单发拍进行提示的时候,由于循环节由多个单发拍组成,护士必然会提示多个脉冲和按拍的位置,这时仍然需要遵循只在最后一对脉冲和按拍处使用 Get Set其余部分均使用 Rea Dy。

g 1 1 4 2[offset=4]{
    es.SayReadyGetSetGo_Rea 0 0[];
    es.SayReadyGetSetGo_Dy 1 0[];
    es.SayReadyGetSetGo_Rea 2 0[];
    es.SayReadyGetSetGo_Dy 2.5 1[];
    es.SayReadyGetSetGo_Get 3 0[];
    es.SayReadyGetSetGo_Set 3.5 1[];
    es.SayReadyGetSetGo_Go 4 0[];
    g 0 -1 1 2 #0f8[]{};
    g 2 -1 0.5 3 #0f8[]{};
    g 3 -1 0.5 3 #0f8[]{};
    g 4 -1 0 3 #0f8[]{};
};
eb.AddOneshotBeat 5[];
eb.AddOneshotBeat 7[tick=0.5];
eb.AddOneshotBeat 8[tick=0.5];
eb.AddOneshotBeat 9[];
eb.AddOneshotBeat 11[tick=0.5];
eb.AddOneshotBeat 12[tick=0.5];

当你不确定一段单发拍提示是否正确时,可以把这段单发拍提示向后复制几份,首尾相连,如果发现所有的 Dy 和 Set 均对齐了按拍时机,就说明单发拍提示是正确的。

复杂脉冲

正如2-1所说的那样,单发拍的脉冲位置并不重要,只要保证按拍位置不变,脉冲位置是可以任意变化的。

同时,一个单发拍也可能拥有不止一个脉冲。若要实现这种效果,只需将几个单发拍的尾端对齐,首端放在不同位置即可。

以下单发拍均是合法的:

eb.AddOneshotBeat 1[];
eb.AddOneshotBeat 3[];
eb.AddOneshotBeat 3.5[tick=0.5];
eb.AddOneshotBeat 4.75[tick=1.25];
eb.AddOneshotBeat 5[];
eb.AddOneshotBeat 5.75[tick=0.25];
eb.AddOneshotBeat 7.5[tick=0.5];

但这样一来前面所说的“Rea、Get 对应单发拍脉冲”就没有意义了吗其实不然Rea、Get 的作用如下:

  1. 护士提示的第一个词必然是 Rea 或 Get也就意味着这个词代表单发拍循环节的开始与末尾的 Go 对应。

  2. Rea、Get 可以辅助玩家掌握单发拍的节奏型。在实际游玩中,玩家通常是会以 Rea、Get 为基础来进行单发拍的演奏的。所以通常要使 Rea、Get 契合音乐或节拍设计,来达到方便玩家记忆或丰富游戏体验的效果。

举个例子Rea-Dy-Get-Set-Go 与 Rea-Dy--GetSet-Go尽管两者的按拍时机相同但不同的 Rea、Get 位置会给人带来不同的游玩体验。

eb.AddOneshotBeat 5[];
eb.AddOneshotBeat 7.5[tick=0.5];
eb.AddOneshotBeat 9[];
eb.AddOneshotBeat 11.5[tick=0.5];
g 1 1 4 1 [offset=4]{
    es.SayReadyGetSetGo_Rea 0[];
    es.SayReadyGetSetGo_Dy 1[];
    es.SayReadyGetSetGo_Get 2.5[];
    es.SayReadyGetSetGo_Set 3[];
    es.SayReadyGetSetGo_Go 4[];
    g 0 -1 1 2 #0f8[]{};
    g 2.5 -1 0.5 2 #0f8[]{};
    g 4 -1 0 2 #0f8[]{};
};

eb.AddOneshotBeat 5 3[];
eb.AddOneshotBeat 7 3[];
eb.AddOneshotBeat 9 3[];
eb.AddOneshotBeat 11 3[];
g 1 4 4 1 [offset=4]{
    es.SayReadyGetSetGo_Rea 0[];
    es.SayReadyGetSetGo_Dy 1[];
    es.SayReadyGetSetGo_Get 2[];
    es.SayReadyGetSetGo_Set 3[];
    es.SayReadyGetSetGo_Go 4[];
    g 0 -1 1 2 #0f8[]{};
    g 2 -1 1 2 #0f8[]{};
    g 4 -1 0 2 #0f8[]{};
};

跳过单发拍

游戏在2-1N中引入了一种全新的单发拍机制:跳过单发拍。这种单发拍的规则很简单:跳过单发拍之后的一次单发拍按拍会被跳过。跳过单发拍无需手动添加提示,只需在单发拍修饰符中选择跳过单发拍,相关的视效与音效提示会被自动添加到关卡中。

当然,在被跳过的单发拍的这段空白时间里,也可以放置多个单发拍脉冲,以丰富谱面的节奏设计。跳过拍的“间隔”参数会影响跳过符号的动画时长。

需要注意的是,跳过单发拍会跳过下一次击拍,而不是下一个循环节。

eb.AddOneshotBeat 1[type=skipshot];
eb.AddOneshotBeat 5[];
eb.AddOneshotBeat 1 2[type=skipshot];
eb.AddOneshotBeat 3 2[tick=3];
eb.AddOneshotBeat 3.75 2[tick=2.25];
eb.AddOneshotBeat 4.5 2[tick=1.5];
eb.AddOneshotBeat 5.25 2[tick=0.75];

另外,在剧情关卡中,跳过拍的位置如果按下空格会计算成失误,但编辑器中默认是不会失误的。

方块单发拍

常规的单发拍是针对一个节奏型的不断重复,而方块单发拍是“一次性”的单发拍,即没有重复,只需按拍一次。

方块单发拍最早出现于MD-1,在第五章更新后也出现在了5-X用于预警细分拍的出现。

选中一个单发拍,在修饰符中选择方块符号,将细分数量设为 1 ,便创建了一个方块单发拍。方块单发拍出现时需要添加特殊音效,在方块单发拍的声音栏选择“特殊”即可自动添加提示音。

除此之外,方块单发拍也需要护士提示。这种护士提示与普通单发拍的提示类似,唯一的不同点在于最后的 Go 被替换为了 One。

eb.AddOneshotBeat 3[];
es.SayReadyGetSetGo_Get 1 1[];
es.SayReadyGetSetGo_Set 2 1[];
es.SayReadyGetSetGo_Go 3 1[];

如果相同拍长的方块单发拍连续出现了多次,无需为每次出现添加完整的护士提示。可以逐步减少护士提示,直到完全没有护士提示,只剩下特殊提示音。

细分拍

与方块单发拍的概念类似,细分拍也是“一次性”的单发拍,但是会产生多次等间距的心跳脉冲,按键的次数也变为多次。

细分拍最早出现于MD-1,当时官方谱面没有官方名称,且最多仅有两个三角拍;后来第五章更新后三角拍首次出现在5-1并正式更名为细分拍,并出现了多个细分;在关卡5-2N中最多涉及到了五级细分;正式版更新后,在关卡7-X2中甚至有了八细分。

在修饰符中选择方块后,将细分数量设为大于 1 的值或者点击细分符号,即可创建细分拍。特殊音效的添加与方块单发拍类似。最多可以将细分数量设置为 10 。

eb.AddOneshotBeat 1[type=subdivision,subdivision=2];
eb.AddOneshotBeat 1 1[type=subdivision,subdivision=3];
eb.AddOneshotBeat 1 2[type=subdivision,subdivision=4];
eb.AddOneshotBeat 1 3[type=subdivision,subdivision=5];

在护士提示方面,不同于方块单发拍,细分拍需要在出拍前的半拍长开始数拍提示。

eb.AddOneshotBeat 1[type=subdivision,subdivision=2];
g 1 1 0.5 1 #0f0[]{};
g 1 1 1 1 #0f0[]{};
g 0.5 1 0.5 1[offset=0.5]{
    es.SayReadyGetSetGo_2 0 1[];
};
eb.AddOneshotBeat 4[tick=2,type=subdivision,subdivision=2,interval=4];
g 4 1 1 1 #0f0[]{};
g 4 1 2 1 #0f0[]{};
g 3 1 1 1[offset=1]{
    es.SayReadyGetSetGo_2 0 1[];
};
eb.AddOneshotBeat 9[tick=2,type=subdivision,subdivision=3,interval=4];
g 9 1 1 1 #0f0[]{};
g 9 1 2 1 #0f0[]{};
g 8 1 1 1[offset=1]{
    es.SayReadyGetSetGo_3 0 1[];
};

如果你搞不懂数拍事件提前放置的规则,可以直接使用第五章新增的单发拍数拍功能。只需将细分偏移设置为 0.5 即可自动且正确地为方块拍和细分拍数拍。但需要注意数拍不会影响单发拍护士提示事件,容易导致聚光灯滞留,可以在第一个数拍处放置一个音量 0% 的单发拍护士数拍事件即可。

注意:非必要情况下,不要关闭方块单发拍和细分拍本身的声音。这对于仅靠听觉游玩的玩家而言是必要的。

单独的细分拍

MD-1 一样,你可以通过 Rea Dy Get Set Two~Ten 来提示单独出现的细分 2 至细分 10 。

单独细分的提示与正常单发拍的提示类似Rea Dy 或 Get Set 之间的间隔同样用于提示细分拍的拍长,且数字提示和 Go! 提示一样不需要提前

eb.AddOneshotBeat 3[type=subdivision,subdivision=2];
es.SayReadyGetSetGo_Get 1 1[];
es.SayReadyGetSetGo_Set 2 1[];
es.SayReadyGetSetGo_2 3 1[];
eb.AddOneshotBeat 9[tick=2,type=subdivision,subdivision=4,interval=4];
es.SayReadyGetSetGo_Get 5 1[];
es.SayReadyGetSetGo_Set 7 1[];
es.SayReadyGetSetGo_4 9 1[];

冻结拍🧊

冻结拍会将单发拍冻住,使下一拍相比正常按拍位置延后一些。

冻结拍很早就存在于编辑器中,但尚未在官方关卡出现,第五章更新后终于在5-2首次露面,并且有了新的特效。

在修饰符中选中冰块符号🧊,就创建了一个冻结拍。创建一个冻结拍后,会多出“延迟”与“间隔”选项,同时相比于更新前,冻结拍在编辑器内的样式也有所变化。

eb.AddOneshotBeat 2[type=freezeshot,delay=0.5,interval=2];
eb.AddOneshotBeat 5[type=freezeshot,delay=0.5,interval=2,tick=2];

对于一个冻结拍而言,一共有五个关键的时间点:左十字,右十字,出拍点(绿线),原按拍点(蓝线),实际按拍点(黄线)。

eb.AddOneshotBeat 2[type=freezeshot,delay=0.5,interval=2];
  • 左十字右十字会显示两次冰冻特效并分别播放不同的冰冻音效,用于预示拍延长的时间。
  • 绿线代表单发拍会在此响一次。
  • 蓝线处会将人物冻成冰块,再显示一次冰冻特效并播放一次冰冻音效,表示拍延长的开始。
  • 黄线处拍会解冻并播放最后一次冰冻音效,也是玩家应该按拍的时机。
  • 绿线蓝线之间的间隔就是拍长的时间。
  • 左十字右十字或者蓝线黄线之间的间隔就是延迟的时间。
  • 左十字蓝线或者右十字黄线之间的间隔就是间隔的时间。
  • 以前由于冻结拍尚不完善导致绿线不允许夹在两个十字之间,现在这种操作已经允许了。

若设计冻结拍,还必须满足以下两个时间点正确:

  • 蓝线所在时间应在正常单发拍的按拍位置上;
  • 左十字必须和上一个普通单发拍的按拍位置重合。
eb.AddOneshotBeat 1[];
eb.AddOneshotBeat 3[type=freezeshot,delay=0.5,interval=2];
eb.AddOneshotBeat 1 1[grayscale=100,offset_grayscale=80];
eb.AddOneshotBeat 3 1[grayscale=100,offset_grayscale=80];

如果需要在冻结拍上叠加多个拍子来凸显鼓点,可以将他们的按拍点放在同一位置。

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首次出现。

在修饰符中选中火焰符号🔥,就创建了一个灼热拍。创建一个灼热拍后,会多出“间隔”选项。

类似地,对于一个灼热拍,一共有四个关键的时间点:左十字,右十字,出拍点(绿线),按拍点。为作区分且方便表述,将会把按拍点称为红线。

eb.AddOneshotBeat 3[tick=0.5,type=burnshot,interval=2];
  • 左十字右十字会显示两次热浪特效并分别播放不同的灼热音效,用于预示拍实际的时间。
  • 绿线处会再显示一次热浪特效并播放一次灼热特效,同时单发拍会在此响一次。
  • 红线处拍会解除灼热状态并播放最后一次灼热音效,也是玩家应该按拍的时机。
  • 左十字右十字或者绿线红线之间的间隔就是拍长的时间。
  • 左十字绿线或者右十字红线之间的间隔就是间隔的时间。

若设计灼热拍,还必须满足以下两个时间点正确:

  • 绿线所在时间应在正常单发拍的原定出拍位置上;
  • 左十字必须和上一个普通单发拍的原定出拍位置重合。
eb.AddOneshotBeat 1[];
eb.AddOneshotBeat 3[tick=0.5,type=burnshot,interval=2];
eb.AddOneshotBeat 1 1[grayscale=100,offset_grayscale=80];
eb.AddOneshotBeat 3 1[grayscale=100,offset_grayscale=80];

如果需要在灼热拍上叠加多个拍子来凸显鼓点,可以将他们的按拍点放在同一位置。

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];
    };
};

长按单发拍

长按单发拍第一次出现在7-1

当听到咻噗的声音时,说明下一次击拍需要长按到下一个出拍点。

在修饰符中选中进度条符号就创建了一个长按单发拍,会多出间隔长按提示选项选项。

对于长按单发拍,一共有四个关键的时间点:十字,出拍点(绿线),按拍点(黄线),长按(紫色格子)。

  { "bar": 1, "beat": 3, "y": 2, "type": "AddOneshotBeat","interval": 2, "tick": 1, "hold": true }
  • 十字显示长按单发拍子的提示音。
  • 绿线代表单发拍会在此响一次。
  • 黄线表示长按的起始点,也就是说玩家应当从这里开始长按。
  • 紫格就是此次长按所需的时间。
  • 绿线黄线之间的间隔就是拍长的时间。
  • 十字黄线或者绿线紫格末端之间的间隔就是间隔的时间。

长按提示有三个选项,分别是:自动、偏早、偏晚。

  • 选择偏早时,十字的位置会在绿线之前。
  • 选择偏晚时,十字不会显示,但提示音会与绿线重合。
  • 选择自动时:
  • 拍长小于或等于1则像偏早一样,长按单发拍子的提示音会在绿线之前;
  • 拍长大于1则像偏晚一样,十字不会显示,但提示音会与绿线重合。
    { "bar": 1, "beat": 3, "y": 2, "type": "AddOneshotBeat","interval": 2, "tick": 1, "hold": true },
    { "bar": 1, "beat": 3, "y": 3, "type": "AddOneshotBeat","interval": 2, "tick": 1, "hold": true },
    { "bar": 1, "beat": 3, "y": 4, "type": "AddOneshotBeat","interval": 2, "tick": 1, "hold": true }

若设计长按单发拍,还必须满足松手音效与提示音不可重叠

如果需要在长按单发拍上叠加多个拍子来凸显鼓点,可以将他们的按拍点放在同一位置。

    { "bar": 1, "beat": 1.5, "y": 2, "tick": 2.5, "type": "AddOneshotBeat" },
    { "bar": 1, "beat": 2.5, "y": 2, "tick": 1.5, "type": "AddOneshotBeat" },
    { "bar": 1, "beat": 3, "y": 2, "type": "AddOneshotBeat","interval": 2, "tick": 1, "hold": true }

最后我们针对细分拍、冻结拍、灼热拍做一个技术总结:

eb.AddOneshotBeat 1[loop=1];
eb.AddOneshotBeat 5[type=freezeshot,delay=0.5,interval=2];
eb.AddOneshotBeat 1 1[loop=1];
eb.AddOneshotBeat 5 1[];
eb.AddOneshotBeat 1 2[loop=1];
eb.AddOneshotBeat 5 2[tick=0.5,type=burnshot,interval=2];
eb.AddOneshotBeat 1 4[loop=1];
eb.AddOneshotBeat 5 4[tick=1,type=subdivision,subdivision=2,interval=2];
eb.AddOneshotBeat 7 4[tick=0.5,loop=1,interval=1];
eb.AddOneshotBeat 9 4[tick=0.5,type=subdivision,subdivision=2,interval=1];
eb.AddOneshotBeat 10 4[tick=2];
eb.AddOneshotBeat 14 4[tick=2,type=subdivision,subdivision=3,interval=4];
g 5 5 0.5 1 #0f0[]{};
g 5 5 1 1 #0f0[]{};
g 4.5 5 0.5 1[offset=0.5]{
    es.SayReadyGetSetGo_2 0 1[];
};
g 9 5 0.25 1 #0f0[]{};
g 9 5 0.5 1 #0f0[]{};
g 8.75 5 0.25 1[offset=0.25]{
    es.SayReadyGetSetGo_2 0 1[];
};
g 14 5 1 1 #0f0[]{};
g 14 5 2 1 #0f0[]{};
g 13 5 1 1[offset=1]{
    es.SayReadyGetSetGo_2 0 1[];
};

冲击拍

冲击拍属于一种单发拍,但在通常情况下相比正常的单发拍而言更快,护士在喊口令的同时会伴有新的哨声提示。

第五章更新后,冲击拍在5-X首次出现。虽然2-2中最快的单发拍也相当快,但并不属于冲击拍。

冲击拍的本质是护士提示带有哨声的单发拍正拍按拍以及快速是其显著特征,这两点在5-X中也有所体现。

冲击拍除了正常的护士提示之外,开始前后还会分别会伴随四声哨子,顺序分别为短低短低高高高高,每声哨子之间的间隔相同,且四声哨子 - 高音效与前四下按拍重合,如下图上半部分。

同时,仅当面临如下图下半部分特定的冲击像正常单发拍转化时,最后三个冲击拍的按拍会伴随三声哨子,顺序分别为高高低

请注意,灰色的护士提示事件只是为了方便理解单发拍机制,实际只需要放置红色护士语音事件即可。

虽然5-X引入了冲击拍,但有几点仍需注意:

  1. 冲击拍依旧是一种单发拍,其护士提示方式与正常拍长的单发拍基本无异,只不过在拍长较短时需要多加两个 Rea Dy 延长预先提示。
  2. 冲击拍并没有正拍按拍以及高速度的强制要求,只要是一组循环的单发拍,无论正反拍都可以加上哨声提示当作冲击拍使用,只需注意使用场景、合理性与便捷性。
  3. 哨声虽然是判定冲击拍的指标,但是这只是一种新的提示方式,只是为了让玩家更好地应对单发拍,请勿为了创造冲击拍而随意添加哨声堆砌提示,否则会显得相当冗杂。

简言之,冲击拍并不是什么新东西,只是加了哨子提示的单发拍,仅此而已。尽管在5-X里其速度和正反按拍切换令人印象深刻,但只需像正常单发拍一样使用即可。

总的来说,冲击拍只是为了符合5-X剧情而设计的机制,其提示方式相较于正常单发拍更为复杂,如果有需要可以添加哨声提示以创造出冲击拍,但是只使用护士语音提示也是完全合理的,需根据个人需求进行选择。虽然我不推荐用就是了,提示整得那么麻烦还容易出错。