今天嘗試將 2D RPG 角色移動模組根據規格畫出 Flowchart 和 State Diagram
首先我們先嘗試使用 Flowchart ,假設從最開始的需求,只有跳躍而已(下圖一),
圖一
到最後除了跳躍,還要有匍匐、前進、後退等,隨著功能增加,添加了許多 flag 儲存不同狀態,以及為了使角色功能正常運作的防呆檢查,最後會像是非常驚人的圖(下圖二),
圖二
不要問我花多久時間畫出來的 QwQ,怕~(說不定還有畫錯?!等待廣大網友們幫我除錯XDD)
(更新:發現我好像有哪裡漏思考畫錯,但沒保留原檔,不願意面對,以後有時間再回去重畫吧)
假設今天有人很認真開發、也很注意每個 if, else 的小細節,也細心思考過每個狀態下的防衛(Guard)跟防呆(Fallback),而且還願意多花自己的時間補齊文件(加班?!),最後畫出一張詳細的流程圖在上方...。
我感到敬佩跟尊重,但不曉得一般人,不管工程師或 PM ,到底願意花多少心力細看上圖二。
假設真的遇到錯誤、bug,不管有沒有這張圖,應該也會迷失在茫茫 bug 海吧?
而且圖中,顯現太多邏輯判斷的細節,其實不需要為外人所知,這些邏輯判斷,也只不過是為了達成規格書要求所產生的。
假設我們今天嘗試採取比較高抽象層次的觀點來著手,還記得昨天提到的
我們先從一個實體對象(entity, object)的觀點出發,假設我們今天實體對象就是玩家操縱的角色,
我們的商業需求,目前有跳躍、俯臥、前後移動,3種主要的大動作,我們可以來細細思考,我們可能需要怎樣的狀態及事件。
先想想,玩家一開始抵達我們的系統會是什麼樣子,應該可以有一個靜止的站姿吧(初始狀態)?
接著先對應到跳躍(Jump)
我們可能有跳躍前、跳躍後...,跳躍是個動作、動詞,所以我們姑且先將他視為一種事件,那這個事件的前後應該是什麼狀態呢?
跳躍依照規格「可能」只能從靜止時開始,所以跳躍前的狀態應該為靜止站姿,進行跳躍時,就要轉換到跳躍中的狀態,跳躍結束時,應該會回到地面靜止站姿的狀態,所以可能應該要有個降落的事件,讓玩家回去。
如果對上述的整理已經產生不肯定、疑惑時,這就是一個去跟 PM 釐清規格很好的時機,不用等到開發下去才再回去改。
再來我們看移動
移動同樣是個動詞、動作,我們應該可以視為一種事件,那移動這個事件應該從什麼狀態開始什麼結束呢?
常理(或照規格)應該是從靜止開始吧?所以站姿靜止狀態經過一個開始移動的事件後,應該要轉移到一個狀態,我們姑且稱這個狀態為站姿移動中,而這個移動中,應該要有個停止,才有辦法回到靜止的狀態,所以我們也應該實作一個停止移動的事件(即放開 ⇦、⇨ )。
一樣,如果對上述的整理已經產生不肯定、疑惑時,這就是一個去跟 PM 釐清規格很好的時機。
最後來看俯臥與匍匐前進
如何匍匐前進、後退?
假設從站立到臥倒,我們可能要一個臥倒的動作及俯臥中的狀態,以及對應回去的起身的動作。
而同上的站姿移動,臥倒中要移動,可能也必須要仰賴開始移動的事件來到匍匐移動中,而停止移動,則可返回靜止臥倒狀態。
如此我們便完成了一張狀態圖
假設今天不管這張圖是從工程師這邊畫出來或從 PM 那邊拿到,是不是比較能輕易理解?
接著明天會將 Flowchart 、 State Diagram 做一個比較