尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
前言
老老實實地去按照 RPGMaker MV 自帶的東西去做遊戲總覺得很無聊,但是我個人又不會寫插件,所以想要盡可能地從事件和簡單的腳本入手,做出一些奇奇怪怪的東西。就這樣,玩壞 MV 系列這麼一個想法就在我心裡誕生了。這裡會記錄一些我制作某些功能實現的過程或者方法,並不會記錄一個完整的遊戲制作流程(因為沒有時間,這個系列也沒有這個目的)。
我已經有一段非常長的時間沒有碰過 RPGMaker MV(以下簡稱 RMMV 或 MV)了,所以需要一個項目來練練手,這個時候我想到或許可以 MV 來做音遊。關於音遊的插件我記得已經有了,我記得是 MOG 系列的?但是我還是想要用事件試著做一下,畢竟這樣很多東西都可以自己設定(但是不會寫插件,限制還是很大啊)
這個系列我想寫的東西,有一些是很以前研究的,所以可能記不清花了多少時間。但是我還是想盡可能每次都記錄一下每一個項目花的時間。這次研究大概花了將近 20 小時。
長文預警,本系列將分 3 部分發表,緩慢更新中。
構思
每一次制作或者嘗試一個項目,都需要首先進行構思,對你想要做的事情有個相對來說比較全面的設想,比如原理(也即項目的內容),畫面布置,可能的實現方法等,方便後面進行嘗試和調整。
原理
這次我想做的是音遊,它的原理就是:
-
有一個物件(我們暫且稱之為音符,我暫時懶得畫,全部用引擎自帶的!Door2裡的漩渦來代替)從遠處向判定點運動;
-
如果玩家在音符經過 判定點 的時候按下了互動鍵,那麼判定玩家的此次操作成功,得分加一;
-
如果不是如同 2 所說的那樣,玩家在音符經過判定點之前或者之後按下了互動鍵,或者乾脆就沒有按,則判定玩家此次操作失敗,得分不變。
畫面布置
我的構思一開始是根據需要將畫面分成四個區域:
-
遊戲區(玩家所能看見的部分。能看見運動向判定點的音符的區域,讓玩家預判什麼時候按互動鍵;同時起到判定是否成功的區域)
-
準備區(所有本次音遊會出現的音符都先存在這裡,等到曲目播放到需要它們出現的時候,它們才運動到遊戲區)
-
棄置區(所有已經經過判定的音符,都必須離開遊戲區,避免擾亂玩家視線以及影響判定點的判定)
但是因為如果玩家能夠看到的遊戲畫面只有遊戲區,畫面內容可能太空洞,而且也填不滿畫面,所以我參考了節奏醫生(Rhythm Doctor)的某些關卡,添加了一個新的區域
-
舞臺區(在這裡可以放一些隨著曲子而變化的動畫,比如跳舞的小人(不是密碼那個))
最後設計的畫面布局如下(淺綠色為玩家可見區域,深綠色為玩家看不見的地方),音符一列列放置在準備區,到點了,它們就上號,一列列出發經過遊戲區,最後到達棄置區停止運動 :
示意圖
實現設想
我一開始的設想是抓取音符的 x 坐標和判定點的 x 坐標進行對比,如果剛好相等的同時玩家按下了 互動鍵,則操作成功,反之失敗。
隻抓取 x 坐標是因為音遊裡的音符經過判定點的時候,總是從判定點的同一個方向經過。比如我剛剛設計的那個畫面,就是所有音符都是從判定點的右邊穿過判定點,所以它們的 y 坐標一定一樣。
但這樣會有一個問題,就是一個曲子裡需要按到的音符是非常多的,這樣一來就單純抓取音符的 x 坐標就會占用過多的變量。而且如果遊戲區上有多個音符,總不能按一下互動鍵就全部判定了吧,如果真的是這樣,哪怕正在經過判定點的音符判定成功了,後續的音符卻全部判定為失敗,這樣顯然不合理。所以還需要有變量或者其他什麼東西來判斷當前需要判定的是哪個音符。
觸發條件
觸發條件:玩家接觸 / 事件接觸
這時候一個靈感從我腦海閃過,我為什麼不試試玩家接觸亦或者是事件接觸呢?這樣一來只要是接觸了玩家的事件就是當前要判定的 音符。當音符到達判定點(即玩家)的時候,如果玩家按下了互動鍵則操作成功加一分。但是這種實現的設想有至少兩個比較明顯的缺點:
-
因為判定點(玩家)只有一個,所以隻支持單軌道音遊(比如節奏醫生、冰與火之舞(A Dance of Fire and Ice),所有的音符都是用同一個 互動鍵 進行操作),不支持多軌道音遊(比如Deemo、MuseDash、校園偶像計畫、勁舞團,不同軌道上的音符需要對應不同的互動鍵進行操作,大多數下落式音遊屬於此類);
-
無法進行失敗(miss)的判斷,因為所有 miss 的判斷,不管是在經過判定點之前還是之後,都是基於判定點之外的判斷。在音符沒有接觸到玩家的時候,玩家接觸、事件接觸都不起作用,無法進行判斷。所以最後只能通過操作成功一次得一分,操作失敗分數不變來判斷成功了幾次。
所以我打算只做單軌道音遊。因為許久沒有接觸 RM,我已經不太記得玩家接觸和事件接觸的區別,我花了點時間進行測試,因為不明原因,此時我的 MV 出現了 bug,玩家接觸和事件接觸變得沒有區別,導致我浪費了非常多的時間在上面而且還變得非常困惑。
我也不知道為什麼我的 MV 總是時不時會出現 bug,可能我就是正版受害者吧。舉個例子:在地圖上編輯後,在地圖列表稍微偏下的地圖名上右鍵無法顯示全部右鍵菜單內容(它會在你滑鼠光標右下方生成右鍵菜單),但是如果你選擇右鍵菜單裡的編輯後關掉 地圖屬性,這個時候再在同一個地圖名那裡右鍵,右鍵菜單出現的位置變正常了(依舊是滑鼠光標右邊,但是會適當上調以保證右鍵菜單的顯示完全):
不正常的右鍵菜單和正常的右鍵菜單
然後又是因為不明原因,MV 變正常了,使得我通過測試能了解它們之間的區別以及其它各種細節:
-
玩家接觸:玩家主動接觸事件,如果是事件來碰玩家則不會觸發。如果優先級是與人物相同的話,觸發是發生在事件與玩家相鄰一格同時玩家面向事件的時候(同時如果事件還設了穿透,則通過走向(方向鍵)事件的方式無法觸發,必須使用確定鍵);如果優先級是在人物上 / 下方的話,觸發發生在事件與玩家處於同一格的時候
-
事件接觸:不管是哪方主動接觸都可以觸發。如果優先級是與人物相同的話,事件可以主動接觸玩家來觸發,位置在與玩家相鄰一格的位置,沒有朝向要求(如果同時事件還設了穿透,同樣也是得通過確定鍵才能觸發);如果優先級是在人物上 / 下方的話,事件無法主動觸發,需要玩家去觸碰事件才能觸發,位置在同一格
-
如果事件優先級不是與人物相同的話(即玩家和事件不在同一層),則無論是玩家接觸還是事件接觸的觸發都是接觸的那個瞬間觸發,也就是說如果玩家和事件處於同一格只要過很小的一段時間,都無法達成觸發條件,必須其中某一方離開另一方然後再在接觸的瞬間才能觸發
-
設置移動路線會導致玩家接觸和事件接觸無效。相反,事件的自主移動會使它們失效
這上面的內容我是經過了非常長的測試才搞明白,尤其 3 和 4。因為我是先把我之前寫得那個實現設想的內容做出來後再邊測試邊修改的,後來發現單獨開個新地圖來針對性地對每一種可能進行測試可能效率更高。
經過了一部分測試後,我發現我一開始的實現設想並不能達成我的目的:(其實我已經記不太清我當時是怎麼測試的了,因為是一個月前的事情了,而且當時的測試現場非常混亂)
我先做的是把音符的所有移動路線一次性做完,從準備區到棄置區,經過了幾輪測試,我發現了第 4 點問題;
然後我讓音符通過移動路線移動到和玩家同一格或相鄰一格的位置,發現了第 3 個問題。同時怎麼送走音符也是個問題;
又或者讓音符通過移動路線移動到和玩家比較近的位置後改為自主移動 – 接近同時自主移動裡的速度和頻率調得和移動路線裡的最終情況一樣
觸發條件:確定鍵
或許接觸可以達成我想要實現的樣子,但是經過了非常長的測試,出現了非常多的問題,我已經對這個方案失去了耐心,所以拋棄了這個方案。我開始嘗試將觸發條件改為確定鍵。但是確定鍵這個方案也出了非常多的問題,比如說:
-
它的判定條件比較嚴格,必須玩家和事件都在格子上才能觸發,如果其中某一方在移動,觸發概率就會變小,哪怕理論上符合觸發條件也可能出現按下確定鍵也沒有觸發的情況
-
如果兩個事件疊在了一起,事件 ID 比較大的那個,會導致事件 ID 比較小的那個無法達成 “觸發條件:確定鍵”的情況,即,就算觸發條件符合,事件 ID 小的那個按下確定鍵也不會觸發(事件編輯器左上角那個就是本事件的 ID)
……
事件 ID
在這期間我還測試了不少有趣的東西,比如說我中途試著把畫面布局從「事件移動,玩家固定」改為「事件固定,玩家移動」的模式。不過這種模式下,舞臺區可能就是一個巨大的問題,因為鏡頭一直隨著玩家角色的移動而移動,舞臺區的內容必須保持同樣的移動。
示意圖
其實最後真正讓我放棄「觸發條件:確定鍵」的原因是:它雖然能做出單擊音,但卻無法做出長按音的效果。「觸發條件:確定鍵」的觸發是在你按下確定鍵的瞬間觸發的,如果你一直按著確定鍵則沒有任何效果另外,由於該方案無法識別 miss 的情況,玩家可以一直不停地反覆按確定鍵,那玩家甚至可以全部成功,那就失去了音遊原本的意義
觸發條件:並行處理(獲取指定位置的資訊)
這個時候我終於想起有一個東西叫做區域 ID,我一直以為它在變量操作裡,找了好一會才發現它在獲取指定位置的資訊裡。
我一開始的想法是抓取當前音符的 x 坐標和 y 坐標,代入到獲取指定位置的資訊裡獲取它下面地圖的區域 ID,以此來判斷該音符到底走到哪裡了,應該對應什麼情況下的判定(判定點前,中還是後)。
示意圖(其中 「H」 為判定點)
單獨測試畫面(按F9時查看變量)
並行處理,抓取區域 ID(變量名,抓取類型,抓取所選取坐標)
但是使用區域 ID需要的變量還是太多了,經過研究後,我決定改用為事件 ID,以此來抓取經過判定點的事件的 ID(得知哪個事件需要進行判定)。
注意:如果使用獲取指定位置的資訊 – 事件 ID的時候,判定點的繪制絕對不可以使用事件來繪制,而應該直接用地圖圖塊來繪制,避免事件對音符的事件 ID抓取的影響。
判定點的繪制
並行處理,抓取事件 ID(變量名,抓取類型,抓取所選取坐標)
這裡解決了一個非常重要的問題,那就是可判定時長。在上面的”觸發條件:確定鍵”裡有一個很大的問題,就是玩家和事件都需要在格子裡,由於其中一方一直在移動,導致這個可以觸發的時長非常的短。但是我們換成「觸發條件:並行處理」之後,這個時長被大大地延長了。
這樣一來,解決了非常多的問題,同時因為不需要玩家操控的這個角色參與(接觸),所以也可以弄成多軌道音遊。
未完待續……
預覽時標簽不可點