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