英雄联盟|【玩坏 MV】制作音游的思路过程(2)
文章图片
文章图片
事件 ID
超长章节预警 , 本章分分页式与一页式两节 。
事件 ID(分页式)
我们想要做的音游经过多次试错 , 修改方案 , 最终终于敲定使用 “触发条件:并行处理(获取指定位置的信息)”的形式进行制作 。可喜可贺可喜可贺!让我们来看看现在的画面布置是怎么样的吧 。(为了使画面简洁 , 我把我原本地图上表示区域的指示牌删掉了)
文章图片
文章图片
示意图
音符:就是音符(note);
音符驱动器:告诉每一个音符怎么运动 , 是要快还是慢;是要直直走还是上蹿下跳(左右横跳) 。最好是一列音符放一个 , (相当是一个小节?) , 专门只控制这一列的音符(编辑器里也不会写太多 , 太难找) , 方便制作者调整 。一列音符运动完就换下一个音符驱动器;
音游启动器:玩家走到上面按下 确定键 开始音游 。同时换新的事件页并行处理 , 玩家移动路线等待 , 以此来阻止玩家在音游中移动影响音游;
音符位置读取器:其实应该叫做音符 ID 读取器 , 它能时时读取 miss_previous , prefect , miss_after 上的事件 ID , 以此来了解当前应该对哪一个音符(事件)进行判断;
miss_previous:判定点前一格 。如果玩家过早(也就是在这里)按下了互动键 , 则判定当前的音符失败;
prefect:判定点 。如果玩家在这里按下互动键 , 则判定当前的音符成功 , 加一分;
miss_after:判定点后一格 。如果玩家过了 prefect(判定点)还没按下互动键(也就是到达了 miss_after) , 则直接判定当前的音符失败(也就是说 , miss_previous 和 prefect 都需要检查玩家是否有按下互动键 , 但是到了 miss_after 就不用了)
(其实我原本打算是读取事件 ID 的任务一起交给 音游启动器 , 但是发现如果 音游启动器一边担负着限制玩家移动的任务 , 一边又要读取事件 ID , 会导致游戏比较严重的掉帧 , 所以最后将 音符位置读取器 单独分了出来)
之后我又发现 , 无论在 音游启动器 里让玩家等待多少帧 , 玩家都有一定几率可以移动 。所以最后我干脆取消了 “让玩家等待来限制玩家移动” 的方式 , 改为 “音游开始的时候玩家四方都出现与玩家相同优先级不可穿透的事件( 阻拦器)” 以此来限制玩家移动 。
文章图片
文章图片
老方案
文章图片
文章图片
修改示意图
接下来让我们详细地看看具体是怎么设定的吧 。
为了使我的记录更加清晰 , 我打算从变量和开关开始下手 , 简化掉其中一些我比较累赘的思考历程 。
文章图片
文章图片
变量
音游阶段:你需要告诉游戏开始了 , 然后现在进行到那一个阶段 , 这个阶段指的不是小到针对每一个音符 , 而是用来控制 音符驱动器 , 告诉游戏现在应该开启哪一个 音符驱动器 了 。最后游戏结束了 , 也是通过这个变量来告诉游戏 。总之我们的思路就是:将小的细节的东西(音符) , 交给一个比较大的东西(音符驱动器)来控制 , 最后我们只要统一管理这个比较大的东西就可以掌控全局了 。有一个分级的概念;分页标题
音游得分:只要有一个音符判定为成功就加一分 , 失败则分数不变 , 最后可以用来看成功了几个音符;
miss_previous:判定点前一格上是否有音符(事件) , 有就读取其事件 ID , 没有则为 0;
prefect:判定点上是否有音符(事件) , 有就读取其事件 ID , 没有则为 0;
miss_after:判定点后一格上是否有音符(事件) , 有就读取其事件 ID , 没有则为 0;
combo:当前连击数;
MAX combo:最大连击数;
文章图片
文章图片
开关
combo:是否连击失败;
校准(一个回合):校准用的音符是否从右到左走完了一个回合 。后两个开关会在后续文章详细解释;
开始校准:是否开始校准;
这些变量和开关其实是和我们游戏进程的思路紧密相关的 , 现在我们来看看我们的游戏进程思路:
游戏进程示意图 当我们在 音游启动器 上按 确定键 开始后 , 变量 音游阶段 +=1 。音游启动器 换新的事件页 , 对玩家使用等待 , 限制玩家移动;( 音游阶段 ==1) 音符位置读取器 出现 , 开始读取 miss_previous , prefect , miss_after 上的事件 ID;( 音游阶段 ==1)第一列 音符驱动器 启动 , 开始移动音符;判定点前中后发现有音符(事件)到达了 , 开始分别进行判定;本列音符全部告知移动路径后 , 变量 音游阶段 +=1;第一列 音符驱动器 打开独立开关 A , 结束它的使命(魔术师倒下);( 音游阶段 ==2)接下来一列的 音符驱动器 启动;... ...最后一个 音游驱动器 完成任务 , 最后一个 音符 经过 miss_after ,音游阶段 最后一次 +=1 ,音符位置读取器 关闭 ,阻拦器 取消对玩家的移动限制;玩家可以查看游戏得分 。
了解完游戏进程(至少有个设计思路) , 我们就可以对我们的事件进行编写了 。
音游启动器
用于启动音游
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
其实 音游启动器只有 第一个事件页有干事情 , 后面都在摸鱼 。原本打算让它限制玩家移动 , 可惜它干不了这活……
注意 , 最后一页的 出现条件 里的变量 音游阶段>=2 , 是因为我测试的时候 , 只做了(column=)1 列音符 , 所以最后要表明这个音游结束了就得是变量 音游阶段= column+1(==2)(音符列数加一)
音符位置读取器
用于读取经过判定点前中后的事件 ID
文章图片
文章图片
文章图片
文章图片
当一个读取点上的事件多于一个的时候 , 它只会告诉你 ID 比较大的那个 。
最后一页结束的出现条件跟 音游启动器 一样 , 都使变量 音游阶段= 音符列数 +1 。
阻拦器
它们其实没啥工作的实质性内容 , 单纯只是为了阻碍玩家的移动 , 避免影响音游 。它们的出现时候的出现条件以及消失时候的出现条件都和 音符位置读取器一样 。分页标题
音符驱动器
驱动音符运动
文章图片
文章图片
文章图片
文章图片
排号 , 等到变量 音游阶段 到了自己负责的序号的时候 , 就驱动音符运动;等自己的负责序号过了之后 , 就暂停工作;它的第一页里的 设置移动路线 部分就是按照你想要的意思移动每一个音符的移动路线 。
注意 , 最好不要在移动路线里的左下角选项那里给 等待完成打勾 , 否则后面的音符都得等前面的音符运动完才可以动 。但是有一个特例 , 那就是最后一列的 音符驱动器 控制的最后一个音符 , 这个音符就必须加上 等待完成 , 否则音游会在最后一列音符开始运动的时候结束 。因为其实 音符驱动器 告知音符怎么运动都是一瞬间的事情 , 只要前面其他音符没有 等待完成 , 后面的音符都是可以和前面的音符几乎是同时获得指令运动 。音符获得运动指令之后就不需要 音符驱动器了 。
另外 ,音符驱动器 需要操控音符达到的位置可以参考这个:(这里的是否分页 , 指的是音符事件内 , 判定音符是否操作成功的指令是否在同一个事件页内) 如果判断为分页式:音符驱动器让音符到达第一个触发点(miss_previous)如果判断为一页式:音符驱动器让音符到达最后一个触发点(miss_after)
文章图片
文章图片
驱动所到达的最终位置示意图 其中左图为分页式: 它的第一页为等待音符到达判定点 , 二三四 页为判定页(分别对应 miss_previous , prefect , miss_after) , 最后 五六页为 显示成功与否图像且不再参与任何判定的事件页(失败 , 成功)而右图为一页式:它的第一页融合了所有的判定 , 第二三页为显示成功与否图像且不再参与任何判定的事件页(失败 , 成功)
为什么不同形式(分页式 / 一页式)的 音符 需要 音符驱动器 驱动到的最后位置不一样呢?
这是因为 , 事件之前接收的 移动路线 , 一旦在这个事件更换事件页就会立马失效 。在分页式的情况下 , 它到达 miss_previous 就需要从第一页换到第二个事件页 , 这时候之前哪怕 音符驱动器 给它下再多的 移动路线 命令都没有用 , 只要之后再没有后续新的 移动路线 指令 , 它就会停下来(不只是影响到自身的移动 , 甚至会影响到后续其他音符的判定) 。
而一页式的情况中 , 它在判定点前中后都不换页 , 直到到 miss_after 后才换页到最后两页显示成功与否图像 , 所以 音符驱动器 必须驱动它达到的最后位置就是 miss_after 。
当然 , 你在 音符驱动器 里可以写非常长的 移动路线 甚至是超过所需的内容 , 只要你到达了我上面所说的两种情况分别所需达到的点就行 , 只是后面的内容都不会应用 。所以这里我说的就是最精简的模式 。
如果这部分你单纯看这里的文字看不懂 , 可以看接下来 音符 部分的具体表现 , 再来结合这段文字(最好有实际操作测试) , 可能更能明白这里的理论 。
音符
所以最好的制作方案 , 就是你一开始就在选择音乐 / 制作音乐的时候就选好所有节拍点(音符) , 并确定它们的类型 。否则因为事件 ID 的连续性 , 后期要改可能比较麻烦 。(但其实这并不是死规定 , 不一定要完全连续 , 只是后面的音符的事件 ID 一定要比前面的大就行 , 连续只是为了容易读以及好看)
单击音
分页标题
文章图片
文章图片
单击音(分页式)的第一页 它在这一页中是被 音符驱动器 驱动着运动 , 等待到达 miss_previous , 自身不做任何事情 。这里我勾选了 固定朝向 是因为如果不固定朝向 , 在 !Door2 里红色漩涡向左运动会变成另一种 颜色。如果是自制音符就不需要在意这一点 。另外我还勾选了 穿透。这是因为我考虑到了有一些音游里的音符是有出现在运动的途中 , 后面的音符超过前面的音符的情况(我的印象中 ,Musedash 的 milk 曲谱里就有类似情况) , 当然 , 在这种情况下 , 后面的音符的事件 ID 需要小于前面的音符的事件 ID 。哪个音符的事件 ID 更小 , 是要看哪个先到达判定点 。
文章图片
文章图片
单击音(分页式)第二页 它在这一页中达到了 miss_previous 的位置 , 开始第一轮判断 , 看玩家是否提前按下了互动键(确定键) , 造成了失败 。如果玩家这个时候没有按下互动键 , 则进入下一个阶段 。本页的 出现条件 就是当 miss_previous 那个位置读取到本音符的事件 ID , 所以把本音符事件 ID 填进去 。这里需要注意的是:从这一页开始往后 ,自主移动 部分的设定都要和该 音符 在 音符驱动器 里最后的速度 , 频率状态相同 , (或者你在该页的 移动路线 里设置为相同) , 否则在判定点附近音符突然变速会扰乱玩家对音符运动的判断 , 极大地破坏游戏体验 。还有 , 这里往后三页就都是我们前面提到的 触发条件:并行处理(获取指定位置的信息), 记得都设定好 。优先级那里 , 因为没有玩家的参与 , 设置什么都无所谓 。另外 , 就如图里的注释写得那样 。因为事件页变了 , 之前所有接收到的 移动路线 都被取消了 。这个时候只能靠音符自身事件里所带的 移动路线 继续推进移动 , 每换一次事件页就至少推动一次 , 所以这里写了 “传递” 。(传递的推进 移动路线 是图里 “如果:按键 [ 确定 ] 正被按着(分歧条件)” 上面那一个 。我原本是把 “传递” 写在分歧条件的后面的 , 发现不起效 , 所以改写在了前面 , 然后就起效了) 。分歧条件里的内容就是本页的重点 , 如果玩家在本音符经过 miss_previous 的任意一瞬间按下了 确定键 (过早操作 , miss) , 则判定为失败 。打开独立开关 A(跳转到第五个事件页 , 显示失败图像) , 同时将音符移到 弃置区, 避免影响其他音符的判定 。分歧条件里的 独立开关 一定要在 移动路线 之前 , 否则 移动路线 会失效 。即 , 我们的目的是先换事件页 , 之后再移动到 弃置区。之所以这么做 , 是因为我们不想在结算页面(成功 / 失败)使用 触发条件:确定键 之外的触发条件 , 尤其是 触发条件:并行处理, 这样才不会占用太多电脑资源 。可是如果结算页面是 触发条件:确定键, 意味着你不去它面前按 确定键, 它是不会执行事件页内的指令的 , 所以不能把将本 音符 移动到 弃置区 的指令放在结算页面 。这样一来 , 我们就只能把退出用的 移动路线 放在跳转前的那个事件页的跳转那个点(打开独立开关)紧接着的地方 。
文章图片
文章图片
单击音(分页式)第三页 它在这一页中到达了 prefect 的位置 , 开始第二轮判断 , 如果玩家这个时候按下了 确定键, 则成功 , 同时得分加一 。如果玩家没有按下 确定键, 则进入下一个阶段 。本页的 出现条件 是当 prefect 那个位置读取到了本音符的事件 ID , 所以把本音符事件 ID 填进去 。“传递” 写在分歧条件之前 。如果玩家在本音符经过 prefect 的任意瞬间按下了 确定键, 则判定为成功 。变量 音游得分 +=1 , 打开独立开关 B(跳转到第六个事件页 , 显示成功图像) , 同时将音符移到 弃置区。分页标题
文章图片
文章图片
单击音(分页式)第四页 它在这一页中到达了 miss_after 的位置 , 开始第三轮判断(其实并没有判断) 。因为玩家在此之前并没有对该音符进行任何操作 , 所以已经无力回天了 , 无论如何都会被判定为失败 。本页的 出现条件 是当 miss_after 那个位置读取到了本音符的事件 ID , 所以把本音符事件 ID 填进去 。打开独立开关 A(跳转到第五个事件页 , 显示失败图像) , 同时将音符移到 弃置区。
文章图片
文章图片
单击音(分页式)第五页 本页为失败图像页 , 记得把图像改为失败时候的图像 。不进行任何额外的操作 。记得后两个事件页因为都要进入 弃置区,弃置区 最后会堆一堆 音符,音符 不会凭空消失 , 所以都需要打开 穿透。
文章图片
文章图片
单击音(分页式)第六页 本页为成功图像页 , 记得把图像改为成功时候的图像 。不进行任何额外的操作 。记得后两个事件页因为都要进入 弃置区,弃置区 最后会堆一堆 音符,音符 不会凭空消失 , 所以都需要打开 穿透。
文章图片
文章图片
文章图片
文章图片
它在这一页中是被 音符驱动器 驱动着运动 , 等待到达 miss_previous , 自身不做任何事情 。
文章图片
文章图片
“传递” 写在分歧条件前 。
文章图片
文章图片
跟 单击音 第三个事件页一模一样 , 变量 音游得分 +=1 , 不再累述 。
文章图片
文章图片
文章图片
文章图片
同 单击音 第五页 。
文章图片
文章图片
同 单击音 第六页 。
文章图片
文章图片
文章图片
文章图片
好吧 , 每种音符(分页式)第一页都是空的(余同)……
分页标题
文章图片
文章图片
“传递” 在分歧条件之上 。
文章图片
文章图片
本音符达到了 prefect 的位置 ,出现条件 那里填上变量 prefect >= 本音符的事件 ID 。“传递”在分歧条件之上 。
文章图片
文章图片
本页是本 音符 到达 miss_after 而切的事件页 , 所以 出现条件 填变量 miss_after >= 本音符的事件 ID 。和上一个事件页一样 , 保持着成功的图像 。
文章图片
文章图片
文章图片
文章图片
所有失败 / 成功页都很接近 , 不再赘述 。
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
实际判定点所处位置
事件 ID(一页式)
正如前面在 事件 ID(分页式)里所说的一样 , 一页式和分页式的主要差别在 音符 的事件里 , 它的判定方法是否有合为一页 。
其它不一样的就是 ,音符驱动器 控制 音符 最远路线的差别: 如果判断为分页式:音符驱动器让音符到达第一个触发点(miss_previous)如果判断为一页式:音符驱动器让音符到达最后一个触发点(miss_after)(这里的是否分页 , 指的是音符事件内 , 判定音符是否操作成功的指令是否在同一个事件页内)
这一小节是 事件 ID(一页式) , 就让我们看看如何把所有判定方法合为一页吧 。
P.S. 前面说了那么多 , 图里也有注释 , 我就不额外在这里打注解了 。另外这里只展示 单击音 的第一页 , 二三页就是常规的空白结算页(失败 / 成功) 。因为其他的都和 事件 ID(分页式)的差不多 , 所以都不再展示 。剩余其他的 音符 道理也差不多 , 根据 事件 ID(分页式)里对应的内容 , 再结合 单击音(一页式)就可以做出来了 。分页标题
单击音
文章图片
文章图片
单击音(一页式)事件编辑器
未完待续……
最后一章将介绍 音符消失、 Combo、 校准、 音游刷新重置所有音符等内容 。
【英雄联盟|【玩坏 MV】制作音游的思路过程(2)】第一部分链接
- 音乐|明通合唱团音乐教师用歌声传唱七人普的意义
- 威海晶合数字矿山|智能传感器是物联网的关键吗?
- 新科技嗅|人工智能可以应用在哪些方面
- 山西君和文悦|工业机器人发展史
- 团团站|团团站——实体门店如何通过朋友圈拓展客户?
- 抽屉电影|为拯救失足女,小警察深陷犯罪泥潭
- 光明网|接客快停快走 公交夜间兜底
- 央视|黎巴嫩总统奥恩:黎以划界以拉斯-纳古拉为起点
- AG|AG战队为何自带招黑体质?黑粉:梦泪天下无敌!AG虐遍全联盟?
- 华为开发者联盟|华为课堂|华为帐号如何保护您的帐号安全?