[请益] 下落式节奏游戏的变速效果

楼主: joe820730 (Let it go)   2021-07-27 02:36:39
如标题
先上作品,其实就是仿制的唯舞独尊
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
有思考过把整条谱面当作一个传送带,经过特殊检查点时改变传送带的移动方向或流速
但当时实作的时候遇到改变流速/方向之后位置跑掉的问题,后来就没有继续研究下去了
所以想来这边问看看有没有写过节奏游戏的前辈,可以在这部分提供一些经验吗?
谢谢
作者: dklassic (DK)   2021-07-27 04:09:00
简单想想到的是让被标示成瞬间静止的 note 只会在整数拍点更新位置,应该可以了?
作者: meowyih (meowyih)   2021-07-27 16:56:00
我的想法是,你一开始设计的data structure本来就不是给那些use case使用的,硬要修改,不如打掉重来。所谓打掉重来的意思是让每个node都独立有自己的进场时间,到击打点的时间,还有移动路径 (向是套个sin就变忽快忽慢),现在的硬件你每个frame扫个几百一千个node不会有任何效能问题,就算真的担心,loading 时自己 sort 一下 node 的进场时间也没什么关系,这样你每个 node 跟其他的 node 就完全无关了,可以任意的客制化当然这样独立会让曲目设计变困难,所以就会开发另一个工具软件帮忙编曲目,设定node数值,输出成json之类的...

Links booklink

Contact Us: admin [ a t ] ucptt.com