LUA在网游任务中的应用

来源:互联网 发布:工业企业进销存软件 编辑:程序博客网 时间:2024/04/28 18:56

转自:http://blog.csdn.net/cd2108006026/archive/2010/03/15/5382868.aspx

 

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配表,再写几个功能函数,大致搞定。不过感觉自己的某些想法可能有些“任性”,目前来说是够用了,未来就难说了,毕竟我无法想象还有什么形式的任务。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cd2108006026/archive/2010/03/15/5382868.aspx

原创粉丝点击