作者joe820730 (Let it go)
看板GameDesign
标题[请益] 下落式节奏游戏的变速效果
时间Tue Jul 27 02:36:39 2021
如标题
先上作品,其实就是仿制的唯舞独尊
https://www.youtube.com/watch?v=nHJy2J6qlOg
没有使用Unity之类的主流游戏引擎,在画面特效上花了不少心思
也因为完全不会PS,所有的图片素材都是用PowerPoint画的
因为工作的关系已经很久没更新了,最近心血来潮想把这个小作品做到一个自己满意的段落
程式码虽然有上传Gitlab,但那时候的coding style实在乱七八糟,迟迟没有机会好好
整理,一些比较很久没动的function甚至还有我自己现在看到会吐血的命名风格...
总之,当时留下的其中一个TODO,就是我这次想问的变速谱面问题
=============================
先说明一下,打击点(下称Note)的资料结构大概是这样:
每个小节之间用Linked list串起来,小节里面再用一个Linked list将Note串起来
| 小节 | -> | 小节 | -> | 小节 |
| O -> O -> O | | O -> O -> O | | O -> O -> O |
上面每个O代表一个Note,用 -> 来代表资料之间用Linked list串联
每个Note都是一个Struct,主要内容是该Note应该出现的时间(下面用NT代称),
以及该Note现在在萤幕上的位置(NPOS)
Note在萤幕的位置则是用音乐播放时间(下面用CT代称)来计算
然後因为设计上会有Note流速的变化,因此还有一个速度参数(SPEED)
所以Note位置的计算公式会是NPOS = (NT-CT) * X * SPEED
其中X为一个常数,用来控制Note的基础流速(或称为1倍速)
========================
以上的方法很好处理,而且可以在一些趣味性质的谱面设计一些超高速的Note来搞初见杀
但是如果要做到整个谱面瞬间停止的效果我就没想法了
所谓的瞬间停止可以参考:
https://youtu.be/nNDqedR2qq4?t=73
有思考过把整条谱面当作一个传送带,经过特殊检查点时改变传送带的移动方向或流速
但当时实作的时候遇到改变流速/方向之後位置跑掉的问题,後来就没有继续研究下去了
所以想来这边问看看有没有写过节奏游戏的前辈,可以在这部分提供一些经验吗?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.227.248.95 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1627324601.A.BE7.html
1F:→ dklassic: 简单想想到的是让被标示成瞬间静止的 note 只会在整数 07/27 04:09
2F:→ dklassic: 拍点更新位置,应该可以了? 07/27 04:09
感谢回覆,但我发现我一开始的叙述会让焦点集中在谱面瞬间停止这件事
的确,如果只是要做到瞬间停止的话,可以用你的方法达成
但是要让整体流速改变就会遇到问题了
https://www.youtube.com/watch?v=98Xljq8MxyU
比如上面这个谱面就做到了:
1. 不同流速的Note同时流动
-> 在我目前的架构上已经验证过可行,Note的内容有标记该Note的流速
2. 单一Note逆流
-> 理论上我目前的架构应该做得到,但印象中直接把Note直接标记成负流速会有问题,
程式码要改一下才能实现,不过这个问题不大
3. 改变整体流速、瞬间停止
-> 其实让整体流速=0就是瞬间停止了,所以这两个应该可以算同一件事?
主要的问题在改变整体流速,以我观察到的主流节奏游戏,大多是这样做的:
| A小节 | -> | B小节 | -> ...
| O -> O -> O | | O -> O -> O |
| 1 倍速 | | 2 倍速 |
假设上图这些Note的时间间隔一致
但是因为两个小节设定的流速不同,所以在画面上的间距不同
也因此当歌曲进入B小节的时候,整条谱面要用2倍流速移动
才能让Note在正确的时间移动到在判定线上
问题就在於整体流速改变後,要如何确保Note出现在判定线的时间不会跑掉
※ 编辑: joe820730 (60.248.108.208 台湾), 07/27/2021 12:10:23
3F:推 meowyih: 我的想法是,你一开始设计的data structure本来就不是给 07/27 16:56
4F:→ meowyih: 那些use case使用的,硬要修改,不如打掉重来。所谓打掉 07/27 16:57
5F:→ meowyih: 重来的意思是让每个node都独立有自己的进场时间,到击打 07/27 16:57
6F:→ meowyih: 点的时间,还有移动路径 (向是套个sin就变忽快忽慢),现 07/27 16:58
其实现在的架构已经是改过的了,比较早期的版本确实是你说的各自独立
虽然一样是用linked list串起来,
但每个Note的位置是个别计算的,彼此之间完全没有关联
不过你这个说法倒是突破我一直以来的盲点了
其实在旧的架构下,既然已经是各自独立计算路径
那就不需要使用统一的公式来计算移动路径
如果每个Note有各自独立的移动路径公式,确实就可以做到各种花式谱面
7F:→ meowyih: 在的硬体你每个frame扫个几百一千个node不会有任何效能问 07/27 16:58
8F:→ meowyih: 题,就算真的担心,loading 时自己 sort 一下 node 的进 07/27 16:59
效能部分我倒是不太担心,我有限制扫瞄范围
我的做法是从最後一个离开判定区的Note开始,只扫描大约5秒范围内的Note
这样不会影响画面,也可以减少不必要的计算(已经离开判定区就不用再扫描了)
9F:→ meowyih: 场时间也没甚麽关系,这样你每个 node 跟其他的 node 就 07/27 16:59
10F:→ meowyih: 完全无关了,可以任意的客制化 07/27 17:00
11F:→ meowyih: 当然这样独立会让曲目设计变困难,所以就会开发另一个工 07/27 17:01
12F:→ meowyih: 具软体帮忙编曲目,设定node数值,输出成json之类的... 07/27 17:02
这就是我当初没有做得太复杂的原因,也是我在这个游戏的另一个未完成的TODO...
当时没有能力去做一个编辑器来让谱面设计视觉化
折衷的办法就是用普通的文字编辑器去设计谱面
但这样理所当然地限制了可以设计的难度,也限制了谱面变化的弹性
最後也很感谢两位的建议
目前已经有新的想法可以去实作
※ 编辑: joe820730 (125.227.248.95 台湾), 07/27/2021 23:05:58