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

看板GameDesign (遊戲設計)作者 (Let it go)時間3年前 (2021/07/27 02:36), 3年前編輯推噓1(1011)
留言12則, 2人參與, 3年前最新討論串1/3 (看更多)
如標題 先上作品,其實就是仿製的唯舞獨尊 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://www.ptt.cc/bbs/GameDesign/M.1627324601.A.BE7.html

07/27 04:09, 3年前 , 1F
簡單想想到的是讓被標示成瞬間靜止的 note 只會在整數
07/27 04:09, 1F

07/27 04:09, 3年前 , 2F
拍點更新位置,應該可以了?
07/27 04:09, 2F
感謝回覆,但我發現我一開始的敘述會讓焦點集中在譜面瞬間停止這件事 的確,如果只是要做到瞬間停止的話,可以用你的方法達成 但是要讓整體流速改變就會遇到問題了 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

07/27 16:56, 3年前 , 3F
我的想法是,你一開始設計的data structure本來就不是給
07/27 16:56, 3F

07/27 16:57, 3年前 , 4F
那些use case使用的,硬要修改,不如打掉重來。所謂打掉
07/27 16:57, 4F

07/27 16:57, 3年前 , 5F
重來的意思是讓每個node都獨立有自己的進場時間,到擊打
07/27 16:57, 5F

07/27 16:58, 3年前 , 6F
點的時間,還有移動路徑 (向是套個sin就變忽快忽慢),現
07/27 16:58, 6F
其實現在的架構已經是改過的了,比較早期的版本確實是你說的各自獨立 雖然一樣是用linked list串起來, 但每個Note的位置是個別計算的,彼此之間完全沒有關聯 不過你這個說法倒是突破我一直以來的盲點了 其實在舊的架構下,既然已經是各自獨立計算路徑 那就不需要使用統一的公式來計算移動路徑 如果每個Note有各自獨立的移動路徑公式,確實就可以做到各種花式譜面

07/27 16:58, 3年前 , 7F
在的硬體你每個frame掃個幾百一千個node不會有任何效能問
07/27 16:58, 7F

07/27 16:59, 3年前 , 8F
題,就算真的擔心,loading 時自己 sort 一下 node 的進
07/27 16:59, 8F
效能部分我倒是不太擔心,我有限制掃瞄範圍 我的做法是從最後一個離開判定區的Note開始,只掃描大約5秒範圍內的Note 這樣不會影響畫面,也可以減少不必要的計算(已經離開判定區就不用再掃描了)

07/27 16:59, 3年前 , 9F
場時間也沒甚麼關係,這樣你每個 node 跟其他的 node 就
07/27 16:59, 9F

07/27 17:00, 3年前 , 10F
完全無關了,可以任意的客製化
07/27 17:00, 10F

07/27 17:01, 3年前 , 11F
當然這樣獨立會讓曲目設計變困難,所以就會開發另一個工
07/27 17:01, 11F

07/27 17:02, 3年前 , 12F
具軟體幫忙編曲目,設定node數值,輸出成json之類的...
07/27 17:02, 12F
這就是我當初沒有做得太複雜的原因,也是我在這個遊戲的另一個未完成的TODO... 當時沒有能力去做一個編輯器來讓譜面設計視覺化 折衷的辦法就是用普通的文字編輯器去設計譜面 但這樣理所當然地限制了可以設計的難度,也限制了譜面變化的彈性 最後也很感謝兩位的建議 目前已經有新的想法可以去實作 ※ 編輯: joe820730 (125.227.248.95 臺灣), 07/27/2021 23:05:58
文章代碼(AID): #1W_m2vld (GameDesign)
文章代碼(AID): #1W_m2vld (GameDesign)