LUA生來是與遊戲相關的;自從魔獸將它發揚光大之後,越來越多的遊戲公司使用它。
遊戲邏輯中與其密切相關的是訪問NPC部分,彈出一個交易框、打造框、任務對話方塊等等,這些基本都是由LUA實現;
本文我想就自己最近的一點兒體會,寫下關於遊戲任務的lua實現;
去年12月份,新遊戲項目成立,分配給我的第一個任務就是編遊戲任務;當時我還不知lua為何物,先花了一天的時間基本熟悉了lua文法(主要是關於table結構),C和lua的相互調用介面;然後摸索著上路了。
我個人比較喜歡自頂向下的學習方法,所以在這裡先給出一個訪問任務NPC的大概輪廓:
1.玩家訪問NPC,用戶端將附帶NPCid的點擊訊息發給伺服器;
2.伺服器尋找關於此NPC的任務菜單(其實是個lua table),判斷玩家是否滿足條件(等級是否合適、前置任務是否完成、是否已經做過。。etc)
3.如果滿足,伺服器填充好表單資訊,並給每個任務按鈕(因為一個NPC處可能不止一個任務)賦予一個從0開始的id索引,為每個按鈕註冊好回呼函數,由id來索引;表單資訊發給用戶端,用戶端執行,從而顯示合適的對話介面;
4.玩家點擊某個任務按鈕,用戶端將其對應的id資訊發給伺服器,伺服器執行相應回調。(比如接任務的時候這個回調大概就是acceptTask(taskid)之類的,交任務的時候這個回調大概就是commitTask(taskid))
真實情況還有很多種,由於接任務是最簡單的,所以選來做說明。
編程式首先要確定好資料結構。我最終定義的struct task大概包含以下成員:任務唯一id,類型,前置任務,任務獎勵道具、經驗、金錢,任務起始NPC(從這裡接),任務終止NPC(到這裡交),任務描述,未完成描述,完成描述,任務元素;還有個別欄位,不是這裡的重點就不提了。確定這個結構前後斷斷續續就用了兩個星期,因為我。。。從來沒打過網遊,最開始的幾天下了幾個網遊用戶端,註冊個號進去玩,簡單的瞭解任務是怎麼回事。
關於任務元素我要詳細解釋一下:
我最初的理解是,任務是要做讓你做一定的事情,然後你才能夠完成這個任務,得到獎勵。於是將它抽象成任務元素。名字可能有點怪,感覺有點順口當時我就這麼定了。
任務元素有類型之分。最常見的兩種類型是 怪物 和 物品。很多任務都是要求殺掉多少個怪、收集多少物品來完成。這也是最簡單最基本的。
後來由於策劃需求的不斷提出,我又增加了一些類型,比如某任務要求你尋訪一些NPC,那麼類型為 VISIT,即訪問。
有些任務讓你答題,又有了類型QUESTION;等等。
在遊戲啟動時,任務資料匯入lua,為每一個跟任務相關的NPC構造lua表,表名尾碼就是相應的npc ID,便於尋找。
接任務的流程開頭已經簡單說過了,這裡再將完成任務簡單說一下。
每當玩家接了一個新任務,那麼這個任務的任務元素會被添加到玩家結構(class Player)的工作管理員(Task Manager)中。工作管理員用一個map來實現管理多個任務的功能。
當玩家訪問這個任務的終止NPC時,會判斷任務元素是否完成了,如果完成會構造提交任務的對話方塊,玩家點擊完成就可獲得該任務獎勵。
如果沒有完成,終止NPC就會說一句相應任務的“未完成描述”。比如可能是一句“連那些毛猴都收拾不了,你真讓我失望”。
上面描述的是最簡單、最常見的任務類型。實際的遊戲任務花樣百出,想用很統一的架構實現是有些難度。但是由於LUA的靈活性(個人認為實質上是table結構靈活,簡直萬能),策劃的一些無法想象的需求(他們拿魔獸的任務來向我描述需求,可是我根本沒碰過魔獸。所以說有些遊戲經驗還是挺好的啊),很多情況下我都用lua table配表,再寫幾個功能函數,大致搞定。不過感覺自己的某些想法可能有些“任性”,目前來說是夠用了,未來就難說了,畢竟我無法想象還有什麼形式的任務。
哎,假如回到大學,我一定要認真的玩一款網路遊戲~