GameDesign 板


LINE

圖文版 http://goo.gl/isGmI 這是 coroutine 系列的最後一篇。相較於狀態機,coroutine 的優勢除了程式 碼比較容易理解外,還有可重覆利用的特性。 在這篇文章中,我們會以對話框作為範例,探討如何讓這個遊戲中的常見功能變 得容易使用。 我們要製作的對話框看起來非常簡單,就像這樣: http://goo.gl/knN7d 這種對話框在遊戲中相當常見,我們先試著用狀態機來實作看看。 使用狀態機的情況 對話框的各個 state 長這樣: A(確定時的下一個 state) 動畫結束 點擊 ↗ 淡入 ---→ 等待 ---→ 淡出 ↘ B(取消時的下一個 state) 因此我們需要定義三個 state。由於程式碼已經超過 100 行,我貼在 codepad 上,但它還是很重要,請不要因此偷懶不看 XD http://codepad.org/TwqXUMBY 理論上,不管在任何 state,只要讓狀態機轉移到 DIALOG_ENTER 這個狀態,就 相當於呼叫了對話框功能,對話框會開始播放動畫,接著移動到 DIALOG_WAIT 狀態等待玩家選擇。然而在對話框結束後我們卻遇到一個困難:既然狀態機中的 任意 state 都可以「呼叫」對話框功能,我們怎麼知道對話框結束後要轉移到哪 一個 state 呢?總不能讓每個對話框都結束遊戲吧? ? ?(確定) ↘ 動畫結束 點擊 ↗ ?-→淡入 ---→ 等待 ---→ 淡出 (下一個狀態取決於由哪個狀態進入) ↗ ↘ ? ?(取消) 簡單而有效的解法是在進入 DIALOG_ENTER 之前,先在兩個全域變數中設定「確定」 與「取消」所對應到的狀態,這麼一來在 DIALOG_LEAVE 就知道下一個 state 是什 麼了。 -- 確定和取消所對應到的下一個 state -- 需要在進入 DIALOG_ENTER 之前的 state 負責設定 ok_state = "fill next state when player hit OK" cancel_state = "fill next state when player hit CANCEL" state_table["DIALOG_LEAVE"] = { ..., update = function() if system.getTimer() > animation_end then if answer then gotoState(ok_state) else gotoState(cancel_state) end end end } 總結來說,在狀態機內若要呼叫對話框功能,需要以下的操作: 1. 設定全域變數 dialog_text 作為對話框的文字。 2. 設定全域變數 ok_state 及 cancel_state 作為玩家選擇後要轉移的 目標 state。 3. 把目前 state 轉移至 DIALOG_ENTER Coroutine 的情況 回過頭來看看使用 coroutine 的情況。它的實作並不難,就只是個長一點的函式: http://codepad.org/6gdHmH1e (雖然說長一點,但才五十多行!真的) 除了流程更加清楚以外,coroutine 還具備以下的優勢: 1. 不需要用全域變數來傳遞參數或取得回傳值。 2. 它只是個函式呼叫,我們不需要知道函式被誰呼叫--它在 return 時會 自然回到呼叫端。 結語 狀態機並非一無可取。在某些沒有結構化流程中,使用 coroutine 改寫反而較為 困難,比如下面這個例子: A → B ↓ ↗ ↓ D → C 然而,使用狀態機就像只用 goto 而不使用函式或迴圈來寫程式,面對更加複雜的 流程就顯得難以建構與維護。遊戲中需要狀態機的場合,大部份都是具有結構化的 流程,因此使用 coroutine 就相當適合。 * * * * * * 斷斷續續寫了快一個月的 coroutine 系列總算告一段落了,文章中程式碼所占的 比例也達到恐怖的程度。原本我曾想過,在文章中加入這麼多程式碼是否洽當, 但若不把程式碼真的寫出來,實在很難理解為何 coroutine 可以讓流程變得清楚 易懂。 另一方面,使用 coroutine 通常也會搭配大量的 function object 與 closure, 希望各位細細品嘗它們的威力。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.3.139
1F:推 cowbaying:全系列4篇已收精華4-20 06/29 17:53
※ 編輯: littleshan 來自: 202.39.238.241 (07/08 17:57)
2F:推 wangm4a1:推 07/13 23:52







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP