【玩壞 MV】製作音遊的思路過程(1)

johnoo00sp發表於2020-09-10
老老實實地去按照 RPGMaker MV 自帶的東西去做遊戲總覺得很無聊,但是我個人又不會寫外掛,所以想要儘可能地從事件和簡單的指令碼入手,做出一些奇奇怪怪的東西。就這樣,玩壞 MV 系列這麼一個想法就在我心裡誕生了。這裡會記錄一些我製作某些功能實現的過程或者方法,並不會記錄一個完整的遊戲製作流程(因為沒有時間,這個系列也沒有這個目的)。

我已經有一段非常長的時間沒有碰過 RPGMaker MV(以下簡稱 RMMV 或 MV)了,所以需要一個專案來練練手,這個時候我想到或許可以 MV 來做音遊。關於音遊的外掛我記得已經有了,我記得是 MOG 系列的?但是我還是想要用事件試著做一下,畢竟這樣很多東西都可以自己設定(但是不會寫外掛,限制還是很大啊)

這個系列我想寫的東西,有一些是很以前研究的,所以可能記不清花了多少時間。但是我還是想盡可能每次都記錄一下每一個專案花的時間。這次研究大概花了將近 20 小時。

構思

每一次製作或者嘗試一個專案,都需要首先進行構思,對你想要做的事情有個相對來說比較全面的設想,比如原理(也即專案的內容),畫面佈置,可能的實現方法等,方便後面進行嘗試和調整。

原理

這次我想做的是 音遊,它的原理就是:

  • 有一個物件(我們暫且稱之為音符,我暫時懶得畫,全部用引擎自帶的 !Door2 裡的漩渦來代替)從遠處向 判定點運動;
  • 如果玩家在 音符 經過 判定點 的時候按下了互動鍵,那麼判定玩家的此次操作成功,得分加一;
  • 如果不是如同 2 所說的那樣,玩家在 音符 經過判定點 之前或者之後按下了 互動鍵,或者乾脆就沒有按,則判定玩家此次操作失敗,得分不變。

畫面佈置

我的構思一開始是根據需要將畫面分成四個區域:

  • 遊戲區(玩家所能看見的部分。能看見運動向 判定點 的 音符 的區域,讓玩家預判什麼時候按互動鍵;同時起到判定是否成功的區域)
  • 準備區(所有本次音遊會出現的 音符 都先存在這裡,等到曲目播放到需要它們出現的時候,它們才運動到 遊戲區)
  • 棄置區(所有已經經過判定的音符,都必須離開 遊戲區 ,避免擾亂玩家視線以及影響 判定點 的判定)

但是因為如果玩家能夠看到的遊戲畫面只有 遊戲區,畫面內容可能太空洞,而且也填不滿畫面,所以我參考了 節奏醫生(Rhythm Doctor)的某些關卡,新增了一個新的區域

  • 舞臺區(在這裡可以放一些隨著曲子而變化的動畫,比如跳舞的小人(不是密碼那個))

最後設計的畫面佈局如下(淺綠色為玩家可見區域,深綠色為玩家看不見的地方),音符一列列放置在 準備區,到點了,它們就上號,一列列出發經過 遊戲區,最後到達 棄置區 停止運動 :

【玩壞 MV】製作音遊的思路過程(1)
示意圖

實現設想

我一開始的設想是抓取 音符 的 x 座標和 判定點的 x 座標進行對比,如果剛好相等的同時玩家按下了 互動鍵,則操作成功,反之失敗。

只抓取 x 座標是因為音遊裡的 音符 經過 判定點 的時候,總是從 判定點的同一個方向經過。比如我剛剛設計的那個畫面,就是所有 音符 都是從判定點 的右邊穿過 判定點,所以它們的 y 座標一定一樣。

但這樣會有一個問題,就是一個曲子裡需要按到的 音符 是非常多的,這樣一來就單純抓取 音符 的 x 座標就會佔用過多的變數。而且如果 遊戲區 上有多個音符,總不能按一下 互動鍵就全部判定了吧,如果真的是這樣,哪怕正在經過 判定點 的 音符 判定成功了,後續的 音符 卻全部判定為失敗,這樣顯然不合理。所以還需要有變數或者其他什麼東西來判斷當前需要判定的是哪個音符。

觸發條件

觸發條件:玩家接觸 / 事件接觸

這時候一個靈感從我腦海閃過,我為什麼不試試 玩家接觸 亦或者是 事件接觸 呢?這樣一來只要是接觸了玩家的事件就是當前要判定的 音符。當 音符 到達 判定點(即玩家)的時候,如果玩家按下了 互動鍵 則操作成功加一分。但是這種實現的設想有至少兩個比較明顯的缺點:

  • 因為 判定點(玩家)只有一個,所以只支援單軌道音遊(比如 節奏醫生、冰與火之舞(A Dance of Fire and Ice),所有的 音符都是用同一個 互動鍵 進行操作),不支援多軌道音遊(比如 Deemo、MuseDash、LoveLive!、勁舞團,不同軌道上的 音符需要對應不同的 互動鍵 進行操作,大多數下落式音遊屬於此類);
  • 無法進行失敗(miss)的判斷,因為所有 miss 的判斷,不管是在經過 判定點 之前還是之後,都是基於 判定點 之外的判斷。在 音符 沒有接觸到玩家的時候,玩家接觸、事件接觸 都不起作用,無法進行判斷。所以最後只能通過操作成功一次得一分,操作失敗分數不變來判斷成功了幾次。

所以我打算只做單軌道音遊。

因為許久沒有接觸 RM,我已經不太記得 玩家接觸 和 事件接觸 的區別,我花了點時間進行測試,因為不明原因,此時我的 MV 出現了 bug,玩家接觸 和 事件接觸 變得沒有區別,導致我浪費了非常多的時間在上面而且還變得非常困惑。

我也不知道為啥我的 MV 總是時不時會出現 bug,可能我就是正版受害者吧。舉個例子:在地圖上編輯後,在地圖列表稍微偏下的地圖名上右鍵無法顯示全部右鍵選單內容(它會在你滑鼠游標右下方生成右鍵選單),但是如果你選擇右鍵選單裡的編輯後關掉 地圖屬性,這個時候再在同一個地圖名那裡右鍵,右鍵選單出現的位置變正常了(依舊是滑鼠游標右邊,但是會適當上調以保證右鍵選單的顯示完全):

【玩壞 MV】製作音遊的思路過程(1)
不正常的右鍵選單和正常的右鍵選單

然後又是因為不明原因,MV 變正常了,使得我通過測試能瞭解它們之間的區別以及其它各種細節:

  • 玩家接觸:玩家主動接觸事件,如果是事件來碰玩家則不會觸發。如果優先順序是 與人物相同 的話,觸發是發生在事件與玩家相鄰一格同時玩家面向事件的時候(同時如果事件還設了 穿透,則通過走向(方向鍵)事件的方式無法觸發,必須使用 確定鍵);如果優先順序是 在人物上 / 下方 的話,觸發發生在事件與玩家處於同一格的時候
  • 事件接觸:不管是哪方主動接觸都可以觸發。如果優先順序是 與人物相同的話,事件可以主動接觸玩家來觸發,位置在與玩家相鄰一格的位置,沒有朝向要求(如果同時事件還設了穿透,同樣也是得通過 確定鍵才能觸發);如果優先順序是在人物上 / 下方的話,事件無法主動觸發,需要玩家去觸碰事件才能觸發,位置在同一格
  • 如果事件優先順序不是與人物相同的話(即玩家和事件不在同一層),則無論是玩家接觸還是事件接觸 的觸發都是接觸的那個瞬間觸發,也就是說如果玩家和事件處於同一格只要過很小的一段時間,都無法達成觸發條件,必須其中某一方離開另一方然後再在接觸的瞬間才能觸發
  • 設定移動路線 會導致 玩家接觸 和 事件接觸 無效。相反,事件的 自主移動 會使它們失效

這上面的內容我是經過了非常長的測試才搞明白,尤其 3 和 4。因為我是先把我之前寫得那個實現設想的內容做出來後再邊測試邊修改的,後來發現單獨開個新地圖來針對性地對每一種可能進行測試可能效率更高。

經過了一部分測試後,我發現我一開始的實現設想並不能達成我的目的:(其實我已經記不太清我當時是怎麼測試的了,因為是一個月前的事情了,而且當時的測試現場非常混亂)

我先做的是把 音符 的所有 移動路線 一次性做完,從 準備區 到 棄置區,經過了幾輪測試,我發現了第 4 點問題;

然後我讓 音符 通過 移動路線 移動到和玩家同一格或相鄰一格的位置,發現了第 3 個問題。同時怎麼送走 音符 也是個問題;

又或者讓 音符 通過 移動路線 移動到和玩家比較近的位置後改為 自主移動 - 接近 同時 自主移動 裡的速度和頻率調得和 移動路線 裡的最終情況一樣

觸發條件:確定鍵

或許 接觸 可以達成我想要實現的樣子,但是經過了非常長的測試,出現了非常多的問題,我已經對這個方案失去了耐心,所以拋棄了這個方案。我開始嘗試將 觸發條件 改為 確定鍵。但是 確定鍵 這個方案也出了非常多的問題,比如說:

  • 它的判定條件比較嚴格,必須玩家和事件都在格子上才能觸發,如果其中某一方在移動,觸發概率就會變小,哪怕理論上符合觸發條件也可能出現按下 確定鍵 也沒有觸發的情況
  • 如果兩個事件疊在了一起,事件 ID 比較大的那個,會導致事件 ID 比較小的那個無法達成 "觸發條件:確定鍵" 的情況,即,就算觸發條件符合,事件 ID 小的那個按下 確定鍵 也不會觸發(事件編輯器左上角那個就是本事件的 ID)

……

【玩壞 MV】製作音遊的思路過程(1)
事件 ID

在這期間我還測試了不少有趣的東西,比如說我中途試著把畫面佈局從“事件移動,玩家固定”改為“事件固定,玩家移動”的模式。不過這種模式下,舞臺區 可能就是一個巨大的問題,因為鏡頭一直隨著玩家角色的移動而移動,舞臺區 的內容必須保持同樣的移動。

【玩壞 MV】製作音遊的思路過程(1)
示意圖

其實最後真正讓我放棄 “觸發條件:確定鍵” 的原因是:它雖然能做出 單擊音,但卻無法做出 長按音 的效果。“觸發條件:確定鍵” 的觸發是在你按下 確定鍵 的瞬間觸發的,如果你一直按著 確定鍵 則沒有任何效果

另外,由於該方案無法識別 miss 的情況,玩家可以一直不停地反覆按 確定鍵,那玩家甚至可以全部成功,那就失去了音遊原本的意義

觸發條件:並行處理(獲取指定位置的資訊)

這個時候我終於想起有一個東西叫做 區域 ID,我一直以為它在 變數操作 裡,找了好一會才發現它在 獲取指定位置的資訊 裡。

我一開始的想法是抓取當前 音符 的 x 座標和 y 座標,代入到 獲取指定位置的資訊 裡獲取它下面地圖的 區域 ID ,以此來判斷該 音符 到底走到哪裡了,應該對應什麼情況下的判定(判定點 前,中還是後)。

【玩壞 MV】製作音遊的思路過程(1)
示意圖(其中 “H” 為 判定點)

【玩壞 MV】製作音遊的思路過程(1)
單獨測試畫面(按 F9 時檢視變數)

【玩壞 MV】製作音遊的思路過程(1)
並行處理,抓取 區域 ID(變數名,抓取型別,抓取所選取座標)

但是使用 區域 ID 需要的變數還是太多了,經過研究後,我決定改用為 事件 ID ,以此來抓取經過 判定點 的事件的 ID(得知哪個事件需要進行判定)。

注意:如果使用 獲取指定位置的資訊 - 事件 ID 的時候,判定點的繪製絕對不可以使用事件來繪製,而應該直接用地圖圖塊來繪製,避免事件對 音符 的 事件 ID 抓取的影響。

【玩壞 MV】製作音遊的思路過程(1)
判定點的繪製

【玩壞 MV】製作音遊的思路過程(1)
並行處理,抓取 事件 ID (變數名,抓取型別,抓取所選取座標)

這裡解決了一個非常重要的問題,那就是可判定時長。在上面的 "觸發條件:確定鍵" 裡有一個很大的問題,就是玩家和事件都需要在格子裡,由於其中一方一直在移動,導致這個可以觸發的時長非常的短。但是我們換成 “觸發條件:並行處理” 之後,這個時長被大大地延長了。

這樣一來,解決了非常多的問題,同時因為不需要玩家操控的這個角色參與(接觸),所以也可以弄成多軌道音遊。

未完待續……


來源:INDIENOVA
原文:https://indienova.com/indie-game-development/making-music-game-rmmv-1/#iah-1

相關文章