關于LUA在網游任務中應用教程
關于LUA在網游任務中的應用是本文要介紹的內容,主要是來了解LUA中網游的問題。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配表,再寫幾個功能函數,大致搞定。不過感覺自己的某些想法可能有些“任性”,目前來說是夠用了,未來就難說了,畢竟我無法想象還有什么形式的任務。
小結:關于LUA在網游任務中應用教程的內容介紹完了,希望通過本文的學習能對你有所幫助!