[請益] 下落式節奏遊戲的變速效果

作者: 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