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

楼主: aegis123321 (PE)   2021-07-27 22:55:59
※ 引述《joe820730 (Let it go)》之铭言:
: =============================
: 先说明一下,打击点(下称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的位置函数,所以不用想怎么"突然改变note的速度"
任何改变都会直接让note飘移,视觉上不可行的
用函数角度来想的话,这个就只是个斜率为X*Speed的直线
所以也不可能让你的Speed=0,那只会直接让note停在你的判定点上不动
那变速这件事情就只能建立在这个函数本身才行
因为NPOS就是NT与CT的位置差,我们可以把原式换成这样:
Pos(t) = t * X * SPEED
NPOS = Pos(NT) - Pos(CT)
接着来做整体流速改变:
举例来说在t=0.5前速度为1,之后速度为2
那就把Pos函数改成
Pos(t) = min(0.5, t) * X * 1 + max(0, t - 0.5) * X * 2
也就是t小于0.5以前的斜率为X*1,之后的斜率为X*2
NPOS算法一样,就能得到变速效果,停止、倒退效果也同理
Pos(t)的函数用程式写起来更容易,要处理N个变速点也应该不难
不过还没验证过 单纯讨论想法看看
作者: tarrytu (LASK)   2021-07-28 20:38:00
推这篇,原Po给的参考游戏就是用这个方法做的
作者: joe820730 (Let it go)   2021-07-29 01:02:00
感谢,今天上班花了点时间想这个方法,结果才发现其实我的公式是写成NPOS=(NT-CT)*X*SPEED,其实就是简化了不过还是非常感谢你的建议再推一下,刚才我终于想通了,基于你所说的公式,如果反而不能把公式化简,否则变速效果就会各自独立了

Links booklink

Contact Us: admin [ a t ] ucptt.com