【玩壞 MV】製作音遊的思路過程(2)
【玩壞 MV】製作音遊的思路過程(1)
事件 ID(分頁式)
我們想要做的音遊經過多次試錯,修改方案,最終終於敲定使用 “觸發條件:並行處理(獲取指定位置的資訊)” 的形式進行製作。可喜可賀可喜可賀!讓我們來看看現在的畫面佈置是怎麼樣的吧。(為了使畫面簡潔,我把我原本地圖上表示區域的指示牌刪掉了)
示意圖
音符:就是音符(note);
音符驅動器:告訴每一個音符怎麼運動,是要快還是慢;是要直直走還是上躥下跳(左右橫跳)。最好是一列音符放一個,(相當是一個小節?),專門只控制這一列的音符(編輯器裡也不會寫太多,太難找),方便製作者調整。一列音符運動完就換下一個音符驅動器;
音遊啟動器:玩家走到上面按下 確定鍵 開始音遊。同時換新的事件頁並行處理,玩家移動路線等待,以此來阻止玩家在音遊中移動影響音遊;
音符位置讀取器:其實應該叫做音符 ID 讀取器,它能時時讀取 miss_previous,prefect,miss_after 上的事件 ID,以此來了解當前應該對哪一個音符(事件)進行判斷;
miss_previous:判定點前一格。如果玩家過早(也就是在這裡)按下了互動鍵,則判定當前的音符失敗;
prefect:判定點。如果玩家在這裡按下互動鍵,則判定當前的音符成功,加一分;
miss_after:判定點後一格。如果玩家過了 prefect(判定點)還沒按下互動鍵(也就是到達了 miss_after),則直接判定當前的音符失敗(也就是說,miss_previous 和 prefect 都需要檢查玩家是否有按下互動鍵,但是到了 miss_after 就不用了)
(其實我原本打算是讀取事件 ID 的任務一起交給 音遊啟動器,但是發現如果 音遊啟動器 一邊擔負著限制玩家移動的任務,一邊又要讀取事件 ID,會導致遊戲比較嚴重的掉幀,所以最後將 音符位置讀取器 單獨分了出來)
第一個音符是單擊音,後四個是長按音。在音符移動過程中,可以隨意調整速度以及上下位置來提高音遊難度。其中紅色為 “未判定”,綠色為 “成功”,藍色為 “失敗”。
之後我又發現,無論在 音遊啟動器 裡讓玩家等待多少幀,玩家都有一定機率可以移動。所以最後我乾脆取消了 “讓玩家等待來限制玩家移動” 的方式,改為 “音遊開始的時候玩家四方都出現與玩家相同優先順序不可穿透的事件(阻攔器)” 以此來限制玩家移動。
老方案
修改示意圖
接下來讓我們詳細地看看具體是怎麼設定的吧。
為了使我的記錄更加清晰,我打算從變數和開關開始下手,簡化掉其中一些我比較累贅的思考歷程。
變數
音遊階段:你需要告訴遊戲開始了,然後現在進行到那一個階段,這個階段指的不是小到針對每一個音符,而是用來控制 音符驅動器,告訴遊戲現在應該開啟哪一個 音符驅動器 了。最後遊戲結束了,也是通過這個變數來告訴遊戲。總之我們的思路就是:將小的細節的東西(音符),交給一個比較大的東西(音符驅動器)來控制,最後我們只要統一管理這個比較大的東西就可以掌控全域性了。有一個分級的概念;
音遊得分:只要有一個音符判定為成功就加一分,失敗則分數不變,最後可以用來看成功了幾個音符;
miss_previous:判定點前一格上是否有音符(事件),有就讀取其事件 ID,沒有則為 0;
prefect:判定點上是否有音符(事件),有就讀取其事件 ID,沒有則為 0;
miss_after:判定點後一格上是否有音符(事件),有就讀取其事件 ID,沒有則為 0;
combo:當前連擊數;
MAX combo:最大連擊數;
開關
長按失敗:音遊裡有一些連起來的音符需要你整個過程長按互動鍵,一旦你中間鬆開了互動鍵,前面已經成功的音符不會受到影響,但是長按音中當前的音和後續的音都會直接判定為失敗;
combo:是否連擊失敗;
校準(一個回合):校準用的音符是否從右到左走完了一個回合。後兩個開關會在後續文章詳細解釋;
開始校準:是否開始校準;
這些變數和開關其實是和我們遊戲程式的思路緊密相關的,現在我們來看看我們的遊戲程式思路:
遊戲程式示意圖
- 當我們在 音遊啟動器 上按 確定鍵 開始後,變數 音遊階段 +=1。音遊啟動器 換新的事件頁,對玩家使用等待,限制玩家移動;
- (音遊階段 ==1)音符位置讀取器 出現,開始讀取 miss_previous,prefect,miss_after 上的事件 ID;
- (音遊階段 ==1)第一列 音符驅動器 啟動,開始移動音符;
- 判定點前中後發現有音符(事件)到達了,開始分別進行判定;
- 本列音符全部告知移動路徑後,變數 音遊階段 +=1;
- 第一列 音符驅動器 開啟獨立開關 A,結束它的使命(魔術師倒下);
- (音遊階段 ==2)接下來一列的 音符驅動器 啟動;
- ... ...
- 最後一個 音遊驅動器 完成任務,最後一個 音符 經過 miss_after,音遊階段 最後一次 +=1,音符位置讀取器 關閉,阻攔器 取消對玩家的移動限制;
- 玩家可以檢視遊戲得分。
瞭解完遊戲程式(至少有個設計思路),我們就可以對我們的事件進行編寫了。
音遊啟動器
用於啟動音遊
其實 音遊啟動器 只有第一個事件頁有幹事情,後面都在摸魚。原本打算讓它限制玩家移動,可惜它幹不了這活……
注意,最後一頁的 出現條件 裡的變數 音遊階段 >=2,是因為我測試的時候,只做了(column=)1 列音符,所以最後要表明這個音遊結束了就得是變數 音遊階段 = column+1(==2)(音符列數加一)
音符位置讀取器
用於讀取經過判定點前中後的事件 ID
當一個讀取點上的事件多於一個的時候,它只會告訴你 ID 比較大的那個。
最後一頁結束的出現條件跟 音遊啟動器 一樣,都使變數 音遊階段 = 音符列數 +1。
阻攔器
它們其實沒啥工作的實質性內容,單純只是為了阻礙玩家的移動,避免影響音遊。它們的出現時候的出現條件以及消失時候的出現條件都和 音符位置讀取器 一樣。
音符驅動器
驅動音符運動
排號,等到變數 音遊階段 到了自己負責的序號的時候,就驅動音符運動;等自己的負責序號過了之後,就暫停工作;它的第一頁裡的 設定移動路線 部分就是按照你想要的意思移動每一個音符的移動路線。
注意,最好不要在移動路線裡的左下角選項那裡給 等待完成 打勾,否則後面的音符都得等前面的音符運動完才可以動。但是有一個特例,那就是最後一列的 音符驅動器 控制的最後一個音符,這個音符就必須加上 等待完成,否則音遊會在最後一列音符開始運動的時候結束。因為其實 音符驅動器 告知音符怎麼運動都是一瞬間的事情,只要前面其他音符沒有 等待完成,後面的音符都是可以和前面的音符幾乎是同時獲得指令運動。音符獲得運動指令之後就不需要 音符驅動器 了。
另外,音符驅動器 需要操控音符達到的位置可以參考這個:(這裡的是否分頁,指的是音符事件內,判定音符是否操作成功的指令是否在同一個事件頁內)
- 如果判斷為分頁式:音符驅動器讓音符到達第一個觸發點(miss_previous)
- 如果判斷為一頁式:音符驅動器讓音符到達最後一個觸發點(miss_after)
驅動所到達的最終位置示意圖
- 其中左圖為分頁式:它的第一頁為等待音符到達判定點,二三四頁為判定頁(分別對應 miss_previous,prefect,miss_after),最後五六頁為顯示成功與否影像且不再參與任何判定的事件頁(失敗,成功)
- 而右圖為一頁式:它的第一頁融合了所有的判定,第二三頁為顯示成功與否影像且不再參與任何判定的事件頁(失敗,成功)
為什麼不同形式(分頁式 / 一頁式)的 音符 需要 音符驅動器 驅動到的最後位置不一樣呢?
這是因為,事件之前接收的 移動路線,一旦在這個事件更換事件頁就會立馬失效。在分頁式的情況下,它到達 miss_previous 就需要從第一頁換到第二個事件頁,這時候之前哪怕 音符驅動器 給它下再多的 移動路線 命令都沒有用,只要之後再沒有後續新的 移動路線 指令,它就會停下來(不只是影響到自身的移動,甚至會影響到後續其他音符的判定)。
而一頁式的情況中,它在判定點前中後都不換頁,直到到 miss_after 後才換頁到最後兩頁顯示成功與否影像,所以 音符驅動器 必須驅動它達到的最後位置就是 miss_after。
當然,你在 音符驅動器 裡可以寫非常長的 移動路線 甚至是超過所需的內容,只要你到達了我上面所說的兩種情況分別所需達到的點就行,只是後面的內容都不會應用。所以這裡我說的就是最精簡的模式。
如果這部分你單純看這裡的文字看不懂,可以看接下來 音符 部分的具體表現,再來結合這段文字(最好有實際操作測試),可能更能明白這裡的理論。
音符
最後出場的就是壓軸的 音符,它們分別有 單擊音、長按音序列。長按音序列 包括 長按音·伯(開頭第一個)、長按音·仲(中間部分)、長按音·季(最後一個)。
強烈建議其他所有事件都建完了,最後再來建 音符,以達到它們的事件 ID 都是連續的目的
另外,建議在一個新的地圖把每四種 音符 的模板都設定好了,然後再直接複製進你製作音遊的那個地圖,可以極大地提高效率。
所以最好的製作方案,就是你一開始就在選擇音樂 / 製作音樂的時候就選好所有節拍點(音符),並確定它們的型別。否則因為事件 ID 的連續性,後期要改可能比較麻煩。(但其實這並不是死規定,不一定要完全連續,只是後面的音符的事件 ID 一定要比前面的大就行,連續只是為了容易讀以及好看)
單擊音
單擊音(分頁式)的第一頁
- 它在這一頁中是被 音符驅動器 驅動著運動,等待到達 miss_previous,自身不做任何事情。
- 這裡我勾選了 固定朝向 是因為如果不固定朝向,在 !Door2 裡紅色漩渦向左運動會變成另一種顏色。如果是自制音符就不需要在意這一點。
- 另外我還勾選了 穿透。這是因為我考慮到了有一些音遊裡的音符是有出現在運動的途中,後面的音符超過前面的音符的情況(我的印象中,Musedash 的 milk 曲譜裡就有類似情況),當然,在這種情況下,後面的音符的事件 ID 需要小於前面的音符的事件 ID。哪個音符的事件 ID 更小,是要看哪個先到達判定點。
單擊音(分頁式)第二頁
- 它在這一頁中達到了 miss_previous 的位置,開始第一輪判斷,看玩家是否提前按下了互動鍵(確定鍵),造成了失敗。如果玩家這個時候沒有按下互動鍵,則進入下一個階段。
- 本頁的 出現條件 就是當 miss_previous 那個位置讀取到本音符的事件 ID,所以把本音符事件 ID 填進去。
- 這裡需要注意的是:從這一頁開始往後,自主移動 部分的設定都要和該 音符 在 音符驅動器 裡最後的速度,頻率狀態相同,(或者你在該頁的 移動路線 裡設定為相同),否則在判定點附近音符突然變速會擾亂玩家對音符運動的判斷,極大地破壞遊戲體驗。還有,這裡往後三頁就都是我們前面提到的 觸發條件:並行處理(獲取指定位置的資訊),記得都設定好。優先順序那裡,因為沒有玩家的參與,設定什麼都無所謂。
- 另外,就如圖裡的註釋寫得那樣。因為事件頁變了,之前所有接收到的 移動路線 都被取消了。這個時候只能靠音符自身事件裡所帶的 移動路線 繼續推進移動,每換一次事件頁就至少推動一次,所以這裡寫了 “傳遞”。(傳遞的推進 移動路線 是圖裡 “如果:按鍵 [ 確定 ] 正被按著(分歧條件)” 上面那一個。我原本是把 “傳遞” 寫在分歧條件的後面的,發現不起效,所以改寫在了前面,然後就起效了)。
- 分歧條件裡的內容就是本頁的重點,如果玩家在本音符經過 miss_previous 的任意一瞬間按下了 確定鍵(過早操作,miss),則判定為失敗。開啟獨立開關 A(跳轉到第五個事件頁,顯示失敗影像),同時將音符移到 棄置區,避免影響其他音符的判定。
- 分歧條件裡的 獨立開關 一定要在 移動路線 之前,否則 移動路線 會失效。即,我們的目的是先換事件頁,之後再移動到 棄置區。之所以這麼做,是因為我們不想在結算頁面(成功 / 失敗)使用 觸發條件:確定鍵 之外的觸發條件,尤其是 觸發條件:並行處理,這樣才不會佔用太多電腦資源。可是如果結算頁面是 觸發條件:確定鍵,意味著你不去它面前按 確定鍵,它是不會執行事件頁內的指令的,所以不能把將本 音符 移動到 棄置區 的指令放在結算頁面。這樣一來,我們就只能把退出用的 移動路線 放在跳轉前的那個事件頁的跳轉那個點(開啟獨立開關)緊接著的地方。
單擊音(分頁式)第三頁
- 它在這一頁中到達了 prefect 的位置,開始第二輪判斷,如果玩家這個時候按下了 確定鍵,則成功,同時得分加一。如果玩家沒有按下 確定鍵,則進入下一個階段。
- 本頁的 出現條件 是當 prefect 那個位置讀取到了本音符的事件 ID,所以把本音符事件 ID 填進去。
- “傳遞” 寫在分歧條件之前。
- 如果玩家在本音符經過 prefect 的任意瞬間按下了 確定鍵,則判定為成功。變數 音遊得分 +=1,開啟獨立開關 B(跳轉到第六個事件頁,顯示成功影像),同時將音符移到 棄置區。
單擊音(分頁式)第四頁
- 它在這一頁中到達了 miss_after 的位置,開始第三輪判斷(其實並沒有判斷)。因為玩家在此之前並沒有對該音符進行任何操作,所以已經無力迴天了,無論如何都會被判定為失敗。
- 本頁的 出現條件 是當 miss_after 那個位置讀取到了本音符的事件 ID,所以把本音符事件 ID 填進去。
- 開啟獨立開關 A(跳轉到第五個事件頁,顯示失敗影像),同時將音符移到 棄置區。
單擊音(分頁式)第五頁
- 本頁為失敗影像頁,記得把影像改為失敗時候的影像。
- 不進行任何額外的操作。
- 記得後兩個事件頁因為都要進入 棄置區,棄置區 最後會堆一堆 音符,音符 不會憑空消失,所以都需要開啟 穿透。
單擊音(分頁式)第六頁
- 本頁為成功影像頁,記得把影像改為成功時候的影像。
- 不進行任何額外的操作。
- 記得後兩個事件頁因為都要進入 棄置區,棄置區 最後會堆一堆 音符,音符 不會憑空消失,所以都需要開啟 穿透。
長按音·伯
長按音·伯(分頁式)第一頁
- 它在這一頁中是被 音符驅動器 驅動著運動,等待到達 miss_previous,自身不做任何事情。
長按音·伯(分頁式)第二頁
- 長按音符的第一個音符到達了 miss_previous 的位置,將其事件 ID 填入 出現條件 中。
- “傳遞” 寫在分歧條件前。
- 其他地方都和 單擊音 的第二頁一樣,這裡只需要再在分歧條件里加上開啟開關 長按失敗,告訴本長按音序列的後續音符本長按音序列已經失敗了。後續的長按音就會直接變為失敗。開啟獨立開關 A(跳轉至第五頁,變為失敗影像),移入 棄置區。
長按音·伯(分頁式)第三頁
- 跟 單擊音 第三個事件頁一模一樣,變數 音遊得分 +=1,不再累述。
長按音·伯(分頁式)第四頁
- 其他的跟 單擊音 第四頁一模一樣。唯一不一樣的是還要再開啟開關 長按失敗,告訴本長按音序列的後續音符本長按音序列已經失敗了。後續的長按音就會直接變為失敗。開啟獨立開關 A(跳轉至第五頁,變為失敗影像),移入 棄置區。
長按音·伯(分頁式)第五頁
- 同 單擊音 第五頁。
長按音·伯(分頁式)第六頁
- 同 單擊音 第六頁。
長按音·仲
長按音·仲(分頁式)第一頁
- 好吧,每種音符(分頁式)第一頁都是空的(餘同)……
長按音·仲(分頁式)第二頁
- 第二頁是當 長按音序列 的 長按音·伯 到達了 miss_previous 開始的,所以它的 出現條件 是變數 miss_previous >= 長按音·伯 的事件 ID。
- 第二頁的目的是為了看本 長按音序列 內的前面部分是否有失敗的,有的話,本音符直接也同樣算為失敗。即,如果前面有 音符 失敗,就會開啟開關 長按失敗,後續 音符 讀取到開關 長安失敗 開啟了,就開啟獨立開關 A(跳轉至第五頁,變為失敗影像),同時移動到 棄置區。
- “傳遞” 在分歧條件之上。
- 退出 / 移除移動路線(移動至 棄置區)參考 長按音·伯 如果在 miss_previous 就失敗,此時本 音符 所處位置的情況(最大距離),取消等待,開啟跳過。
長按音·仲(分頁式)第三頁
- 本音符達到了 prefect 的位置,出現條件 那裡填上變數 prefect >= 本音符的事件 ID。
- 注意,將本頁的影像改為成功時候的影像。這樣一來,一是和之前“未判定”時的影像形成了差異,告訴玩家本 音符 已經達到 prefect 這個 判定點 了;二是告訴玩家,到目前為止玩家的操作都是成功的(保持長按),如果玩家中途鬆了手,本 音符 就會立馬變成失敗影像,形成對比。
- “傳遞”在分歧條件之上。
- 因為這個是 長按音,所以中途任意時刻都不可以鬆手,因此我們需要在分歧條件裡開啟“建立條件不滿足時候的分支”來判斷玩家是否有鬆過手。因為是 並行處理,所以它會一直不停地迴圈對分歧條件進行判斷
- 如果玩家中途有鬆手,則開啟開關 長按失敗,同時開啟獨立開關 A,將已經更改為失敗影像的本 音符 移出 遊戲區。
長按音·仲(分頁式)第四頁
- 本頁是本 音符 到達 miss_after 而切的事件頁,所以 出現條件 填變數 miss_after >= 本音符的事件 ID。
- 和上一個事件頁一樣,保持著成功的影像。
- 與前面的 單擊音 和 長按音·伯 恰恰相反,如果 長按音·仲 達到了 miss_after 卻還沒有因為判定而結算(變成成功 / 失敗影像),說明 長按音·仲 在前面的操作都是成功的,所以應該變數 音遊得分 +=1,開啟獨立開關 B,移動到 棄置區。
長按音·仲(分頁式)第五頁
長按音·仲(分頁式)第五頁
所有失敗 / 成功頁都很接近,不再贅述。
長按音·季
長按音·季(分頁式)第一頁
長按音·季(分頁式)第二頁
- 跟 長按音·仲 第二頁無他樣。
- 唯一的區別,是在分歧條件裡多加了一個關閉開關 長按失敗,以確保後續的 長按音序列 可以再次用同樣的方法使用這個開關。
長按音·季(分頁式)第三頁
- 跟 長按音·仲 第三頁道理類似。
- 唯一區別就是如果中途鬆手了,不需要再開啟開關 長按失敗 了,因為本 長按音序列 沒有後續其他 音符,所以並沒有告知後續 音符 失敗的必要。
長按音·季(分頁式)第四頁
- 跟 長按音·仲 第四頁內容完全一致
長按音·季(分頁式)第五頁
長按音·季(分頁式)第六頁
完成了上述內容,一個既有 單擊音 又有 長按音 音遊的基礎設定就完成了,你就可以依照前面的模板完成一個完整的音遊。另外要注意的是,經過反覆測試,本方案目前的所有判定點在實際操作中都會往前半格,這並不是什麼大的問題,你只要在製作以及繪製 miss_previous、prefect、miss_after 的圖塊時,將它們往前移動半格就行。
實際判定點所處位置
思考時曾經嘗試的老方案
一開始的思考方向是給所有有分歧條件判斷開關 長按失敗 裡都加了關閉開關 長按失敗。
老方案
可發現不在關閉開關 長按失敗 前面加比較短的等待的話,如果 長按音序列 比較長,後續幾個 長按音 都會因為太快關掉開關 長按失敗,沒能接收到這個開關關閉過的訊息,導致它們還是依舊可以繼續進行判定,所以我才在前面加了等待一幀。
只要保持著長按,後續的音符會錯誤地判斷為成功
後來我才意識到 長按音·仲 完全不需要關閉開關 長按失敗 啊,完全可以交給最為最後一個的 長按音·季 來關閉,所以有了現在的你們剛剛看到的在 spoilerblock 之外的方案。
事件 ID(一頁式)
正如前面在 事件 ID(分頁式)裡所說的一樣,一頁式和分頁式的主要差別在 音符 的事件裡,它的判定方法是否有合為一頁。
其它不一樣的就是,音符驅動器 控制 音符 最遠路線的差別:
- 如果判斷為分頁式:音符驅動器讓音符到達第一個觸發點(miss_previous)
- 如果判斷為一頁式:音符驅動器讓音符到達最後一個觸發點(miss_after)(這裡的是否分頁,指的是音符事件內,判定音符是否操作成功的指令是否在同一個事件頁內)
這一小節是 事件 ID(一頁式),就讓我們看看如何把所有判定方法合為一頁吧。
P.S. 前面說了那麼多,圖裡也有註釋,我就不額外在這裡打註解了。另外這裡只展示 單擊音 的第一頁,二三頁就是常規的空白結算頁(失敗 / 成功)。因為其他的都和 事件 ID(分頁式)的差不多,所以都不再展示。剩餘其他的 音符 道理也差不多,根據 事件 ID(分頁式)裡對應的內容,再結合 單擊音(一頁式)就可以做出來了。
單擊音
單擊音(一頁式)事件編輯器
未完待續……
最後一章將介紹 音符消失、Combo、 校準、音遊重新整理重置所有音符 等內容。
來源:indienova
原文:https://indienova.com/indie-game-development/making-music-game-rmmv-2/
相關文章
- 【玩壞 MV】製作音遊的思路過程(1)
- 【玩壞 MV】製作音遊的思路過程(3)
- [譯] 製作 Vue 3 的過程Vue
- 遊戲雜談:大製作遊戲和小製作遊戲,在開發思路方式上的差別遊戲
- 電腦怎麼錄製玩王者榮耀的過程
- 聽Odyssey Interactive講述多平臺遊戲《Omega Strikers》的製作過程遊戲
- 遊戲音樂的認識與製作三遊戲
- 解決方案製作思路
- 企業展廳設計製作的過程分析
- 如何製作一個音遊鬼畜視訊
- 如何通過玩遊戲救地球?騰訊天美製作人提供了一些設計思路遊戲
- 《最終幻想7:重製版》遊戲音訊製作分享遊戲音訊
- 在製作遊戲的過程中,我都解決和改進了哪些問題遊戲
- View 的繪製過程View
- 網路組網七類水晶頭製作方法,七類網線製作過程
- 遊戲原畫教程:手部繪製過程遊戲
- Python 精靈模組製作的月滿西樓李清照詞 MVPython
- 一次壞塊的處理過程(一)
- 一次壞塊的處理過程(二)
- Excel 製作視覺化看板的思路及操作Excel視覺化
- 《完美音浪》總監:怎樣製作一款對玩家更友好的音樂動作遊戲?遊戲
- 一種巧妙的使用 CSS 製作波浪效果的思路CSS
- Android View的繪製過程AndroidView
- 《陰陽師》主美劉爽:式神的角色設計思路和創作過程
- 偏見VS傲慢?為何遊戲總改不好,聊聊遊戲製作過程中的調優調研做法遊戲
- 如何實現遊戲陪玩系統中語音的錄製與播放?遊戲
- 小遊戲的製作遊戲
- 《仙劍奇俠傳七》主題曲MV製作手帳
- katana材質的製作2
- 《植物大戰殭屍》開發者聊《八爪怪》的製作過程
- 服務執行過程中磁碟壞道引起的思考
- 製作遊戲的遊戲:創作樂趣的樂趣遊戲
- 場景製作環節總是效率低?詳解場景製作初期的規劃思路
- 從 UI 設計角度探討如何製作 UI 音訊 – Part 2UI音訊
- 《打字編年史》(Epistory)內容製作開發過程回顧
- 製作暴力遊戲的人平時在過什麼樣的日子?遊戲
- 作業系統啟動的過程作業系統
- 專業音樂製作軟體